修改表
删除约束[语法通用]
alter table table_name drop constraint "some_name";
说明:
1.需要明确操作哪个表
2.需要知道约束的名称[可以是主键约束,外键约束,check约束,unique约束]
3.这对除了非空约束之外所有的约束类型都一样有效
移除非空约束
alter table table_name alter column ID drop not null;
说明:由于非空约束没有名称,因此不能使用上面的方法。
表中的version字段添加check约束
alter table table_name add constraint "table_name_version_check"
check(version between '8-1' and '8-z');
表中字段添加唯一约束unique
alter table table_name add constraint "unique_table_name" unique(id);
增加外键约束
alter table table_name add foreign key (table_name_id)
references table_name2(table_name2_id)
on update cascade on delete cascade;
说明:
on update cascade: 被引用行更新时,引用行自动更新;
on update restrict: 被引用的行禁止更新;
on delete cascade: 被引用行删除时,引用行也一起删除;
on dellete restrict: 被引用的行禁止删除;
增加主键约束
alter table table_name add primary key(id);
表中的字段增加非空约束
alter table table_name alter column ID set not null;
说明:该约束会立即被检查,所以表中的数据在增加非空约束之前需要满足约束条件
增加列
alter table table_name add column name text;
说明:
新列若没有指定默认值,则会填充null
删除列
alter table table_name drop column name;
补充说明:
如果该列是另一个表的外键所引用,删除会失败。通过cascade来授权移除任何依赖于被删除列的所有东西。
alter table table_name drop column name cascade;
更改列的默认值
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
说明:
这不会影响任何表中已经存在的行,它只是为未来的INSERT命令改变了默认值。
删除列的默认值
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
说明:
这等同于将默认值设置为空值。相应的,试图删除一个未被定义的默认值并不会引发错误, 因为默认值已经被隐式地设置为空值
修改列的数据类型
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
说明:只有当列中的每一个项都能通过一个隐式造型转换为新的类型时该操作才能成功。
重命名列
ALTER TABLE products RENAME COLUMN product_no TO product_number;
重命名表
ALTER TABLE products RENAME TO items;
创建表时增加约束
检查约束
列约束
CREATE TABLE products (
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK (price > 0)
);
说明:如果不指定名称CONSTRAINT positive_price 可以省略
表约束
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);
说明:
- CHECK (price > discounted_price) 该约束条件没有依附于任何一个列,属于表级约束
- 列约束和表约束可以同时存在
- 列约束可以写成表约束,但是反过来不行
将列约束改成表约束
CREATE TABLE products (
product_no integer,
name text,
price numeric,
CHECK (price > 0),
discounted_price numeric,
CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);
说明:
一个检查约束在其检查表达式值为真或空值时被满足。因为当任何操作数为空(null)时大部分表达式将计算为空值,所以它们不会阻止被约束列中的控制。为了保证一个列不包含空值,可以使用非空约束not null。
非空约束
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric NOT NULL CHECK (price > 0)
);
说明:一个列可以有多个约束,约束的顺序无关。
唯一约束
CREATE TABLE products (
product_no integer CONSTRAINT must_be_different UNIQUE,
name text,
price numeric
);
说明:
1.可以自己指定约束的名称,CONSTRAINT must_be_different 可以省略,省略后则会有系统指定名称
2. 增加一个唯一约束会在约束中列出的列或列组上自动创建一个唯一B-tree索引
3. 如果表中有超过一行在约束所包括列上的值相同,将会违反唯一约束。但是在这种比较中,两个空值(null)被认为是不同的。即便存在一个唯一约束,也可以存储多个在至少一个被约束列中包含空值的行。
列约束
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric
);
表约束
CREATE TABLE products (
product_no integer,
name text,
price numeric,
UNIQUE (product_no)
);
说明:这种写法和上面的列约束不同,但是实现的效果一样
CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c)
);
说明: 这指定这些列的组合值在整个表的范围内是唯一的,但其中任意一列的值并不需要是唯一的。
主键约束
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
说明:
1.主键唯一且非空
2.主键可以有多个列,联合主键
3.增加一个主键将自动在主键中列出的列或列组上创建一个唯一B-tree索引。并且会强制这些列被标记为NOT NULL
外键约束
外键的定义:
一个外键约束指定一列(或一组列)中的值必须匹配出现在另一个表中某些行的值。我们说
这维持了两个关联表之间的引用完整性。
举例如下:
产品表:
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
假设还有一个存储这些产品订单的表。我们希望保证订单表中只包含真正存在的产品的订单。因此我们在订单表中定义一个引用产品表的外键约束:
订单表:
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products (product_no),
quantity integer
);
现在就不可能创建包含不存在于产品表中的product_no值(非空)的订单。我们说在这种情况下,订单表是引用表而产品表是被引用表。相应地,也有引用和被引用列的说法。
订单表简写:
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products,
quantity integer
);
说明:若为指定被引用列,则被引用表的主键将被用作被引用列
说明
以上来自平时的总结或参考自 PostgreSQL 11.2 手册