postgresql DDL操作

添加列
新加的字段为默认值,如果没有默认值,则会自动默认为空

mydb=# select * from products;
 product_no | name | price
------------+------+-------
          1 | aaa  |  2.11
          1 | aa   |
(2 rows)

mydb=# ALTER TABLE products ADD COLUMN description text;
ALTER TABLE
mydb=# select * from products;
 product_no | name | price | description
------------+------+-------+-------------
          1 | aaa  |  2.11 |
          1 | aa   |       |
(2 rows)

删除列

mydb=# ALTER TABLE products DROP COLUMN description;
ALTER TABLE
mydb=# select * from products;
 product_no | name | price
------------+------+-------
          1 | aaa  |  2.11
          1 | aa   |
(2 rows)

mydb=#

添加列并添加约束
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');

添加表级约束

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;

alter table tablename add check/CONSTRAINT 约束名 UNIQUE/foreign key...

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;//该约束会立即被检查,所以表中的数据必须在约束被增加之前就已经符合约束


ALTER TABLE products ALTER COLUMN name SET NOT NULL;

mydb=# select * from products
mydb-# ;
 product_no | name | price
------------+------+-------
          1 | aaa  |  2.11
          1 | aa   |
(2 rows)

mydb=# update products set name='' where name='aaa';
UPDATE 1
mydb=# select * from products
;
 product_no | name | price
------------+------+-------
          1 | aa   |
          1 |      |  2.11
(2 rows)

mydb=# ALTER TABLE products ADD CHECK (name <> '');
ERROR:  check constraint "products_name_check" is violated by some row //表级约束添加会检查已存在的数据

mydb=# ALTER TABLE products ALTER COLUMN name SET NOT NULL; //只对未来插入的数据生效
ALTER TABLE
mydb=# \d+ products
                                    Table "public.products"
   Column   |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
------------+---------+-----------+----------+---------+----------+--------------+-------------
 product_no | integer |           |          |         | plain    |              |
 name       | text    |           | not null |         | extended |              |
 price      | numeric |           |          |         | main     |              |
Check constraints:
    "positive_price" CHECK (price > 0::numeric)

mydb=#

mydb=# \d+ products
                                    Table "public.products"
   Column   |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
------------+---------+-----------+----------+---------+----------+--------------+-------------
 product_no | integer |           |          |         | plain    |              |
 name       | text    |           | not null |         | extended |              |
 price      | numeric |           |          |         | main     |              |
Check constraints:
    "positive_price" CHECK (price > 0::numeric)

mydb=# insert into products values(2,'',3.0);
INSERT 0 1
mydb=# insert into products values(2,null,3.0);
ERROR:  null value in column "name" violates not-null constraint
DETAIL:  Failing row contains (2, null, 3.0).
mydb=#

删除表级约束
ALTER TABLE products DROP CONSTRAINT some_name;

删除单列的约束

mydb=# ALTER TABLE products ALTER COLUMN name DROP NOT NULL;
ALTER TABLE
mydb=# \d+ products
                                    Table "public.products"
   Column   |  Type   | Collation | Nullable | Defau

lt | Storage | Stats target | Description
------------+---------+-----------+----------+---------+----------+--------------+-------------
product_no | integer | | | | plain | |
name | text | | | | extended | |
price | numeric | | | | main | |
Check constraints:
"positive_price" CHECK (price > 0::numeric)

更改表中的默认值
ALTER TABLE products ALTER COLUMN price SET DEFAULT xxx;
删除默认值
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
修改列的数据类型
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

重命名列

ALTER TABLE products RENAME COLUMN name TO product_name;
mydb=# ALTER TABLE products RENAME COLUMN name TO product_name;
ALTER TABLE
mydb=# \d+ products
                                     Table "public.products"
    Column    |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
--------------+---------+-----------+----------+---------+----------+--------------+-------------
 product_no   | integer |           |          |         | plain    |              |
 product_name | text    |           |          |         | extended |              |
 price        | numeric |           |          |         | main     |              |
Check constraints:
    "positive_price" CHECK (price > 0::numeric)

重命名表名

mydb=# ALTER TABLE products RENAME TO product;
ALTER TABLE
mydb=# \d+ product;
                                     Table "public.product"
    Column    |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
--------------+---------+-----------+----------+---------+----------+--------------+-------------
 product_no   | integer |           |          |         | plain    |              |
 product_name | text    |           |          |         | extended |              |
 price        | numeric |           |          |         | main     |              |
Check constraints:
    "positive_price" CHECK (price > 0::numeric)

mydb=#
posted @ 2022-06-21 11:44  南大仙  阅读(219)  评论(0编辑  收藏  举报