PostgreSQL数据库修改sql表的方法汇总
一,修改表
PostgreSQL 提供了一族命令用于修改現(xiàn)有表。?
可以實(shí)現(xiàn):
增加字段,
刪除字段,
增加約束,
刪除約束,
修改默認(rèn)值,
重命名字段,
重命名表。
這些操作可以用:ALTER TABLE命令執(zhí)行的。
1,增加字段
要增加一個(gè)字段,使用這條命令:?
ALTER TABLE products ADD COLUMN description text;
新增的字段對(duì)于表中已經(jīng)存在的行而言最初將先填充空值。?
你也可以同時(shí)在該字段上定義約束,使用通常的語(yǔ)法:?
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
一個(gè)新字段不能用非空約束,因?yàn)樽畛醯臅r(shí)候該字段必須包含空值。 但是你可以稍后增加一個(gè)非空約束。同樣,你也不能在一個(gè)新字段 上定義默認(rèn)值。根據(jù) SQL 標(biāo)準(zhǔn)的說明,這樣需要對(duì)現(xiàn)存行的新 字段填充默認(rèn)值,而這個(gè)特性還沒有實(shí)現(xiàn)。但是你可以稍后調(diào)整 字段預(yù)設(shè)。
2,刪除字段
除一個(gè)字段:?
ALTER TABLE products DROP COLUMN description;
要增加一個(gè)約束,使用表約束語(yǔ)法。比如:
ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
要增加一個(gè)不能寫成表約束的非空約束,使用下面語(yǔ)法:?
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
這個(gè)約束將立即進(jìn)行檢查,所以表在加入約束之前必須符合約束條件。
4,刪除約束
要?jiǎng)h除一個(gè)約束,你需要知道它的名字。如果你給了它一個(gè)名字, 那么事情就好辦了。
否則系統(tǒng)會(huì)分配一個(gè)生成的名字,這樣你就需要 把它找出來了。psql 的命令 \d tablename 在這兒可以幫忙﹔?
其它接口可能也提供了檢查表的細(xì)節(jié)的方法。
命令:?
ALTER TABLE products DROP CONSTRAINT some_name;
除了非空約束外,所有約束類型都這么用。要?jiǎng)h除非空類型,用?
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(要記得非空約束沒有名字。)
5,改變默認(rèn)值
要給一個(gè)字段設(shè)定默認(rèn)值,使用一個(gè)象下面這樣的命令:?
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
要?jiǎng)h除默認(rèn)值,用?
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
這樣相當(dāng)于把預(yù)設(shè)設(shè)定為空,至少在 PostgreSQL里是這樣的。?
如果刪除一個(gè)還沒有定義的默認(rèn)值不算錯(cuò)誤,因?yàn)轭A(yù)設(shè)隱含就是空值。
6,給字段改名字
重命名一個(gè)字段:?
ALTER TABLE products RENAME COLUMN product_no TO product_number;
To rename a table:?
ALTER TABLE products RENAME TO items;
8, ?postgresql 9.0以后更改字段長(zhǎng)度會(huì)重寫表,如果表比較大,那么表會(huì)加鎖,需要很長(zhǎng)時(shí)間,這里介紹一種方法通過修改pg_attribute.atttypmod字段修改長(zhǎng)度,不需要重寫表
? ? ? 假如表中atttypemod為6,變長(zhǎng)類型頭信息占去4個(gè)字節(jié),這里6-4=2就是我們字段的長(zhǎng)度。
? ? ? 查看修改如下:
select atttypmod from pg_attribute where attrelid='hall_info'::regclass and attname='holiday';
update pg_attribute set atttypmod=19 where attrelid='hall_info'::regclass and attname='holiday';? ?(hall_info:表名,holiday:字段名,該字段長(zhǎng)度改為:15)
注:創(chuàng)建一個(gè)作為外鍵的字段company_id
首先: ? ? alter table dtb_order add column company_id int default 0;
再:???????? alter table dtb_order add foreign key(company_id) references dtb_transinfo;
實(shí)際項(xiàng)目中經(jīng)常會(huì)遇到要修改表結(jié)構(gòu)的需求, 現(xiàn)在總結(jié)下postgres中修改表結(jié)構(gòu)
比如, 現(xiàn)在有個(gè)表,
CREATE TABLE ?test
(
?id ?bigint NOT NULL,
?name character varying,
? CONSTRAINT pk_test PRIMARY KEY (id) ? ? ?-------這個(gè)個(gè)約束(constraint), 主鍵約束
)?
WITH (
? OIDS=FALSE
);
ALTER TABLE pets
? OWNER TO postgres;
1. 增加列, 修改主鍵
之前表有2個(gè)字段, id和name, id是主鍵, 現(xiàn)在有需求增加一個(gè)index, 并且需求是主鍵改為id和index, sql語(yǔ)句如下
alter table test add column test_index smallint not null default 0; ? ? ? ? ?-----------增加一個(gè)列 test_index
alter table test drop constraint pk_test; ? ? ? ?----------------刪除之前的主鍵約束
alter table test add constraint pk_test PRIMARY_KEY(id, test_index); ? ? ? ? ? ------------重新增加一個(gè)主鍵
總結(jié)
以上是生活随笔為你收集整理的PostgreSQL数据库修改sql表的方法汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postgres复制表结构
- 下一篇: eclipse复制代码连接数据库404_