来自PostgreSQL文档
要添加约束,请使用表约束语法。例如:
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 products ALTER COLUMN product_no SET NOT NULL;
ADD
之后的单词为何因不同的约束而有所不同?
为什么唯一约束比检查和外键具有更通用的ADD CONSTRAINT some_name
?
为什么不是ALTER COLUMN
而不是ADD CONSTRAINT some_name NOT NULL (col_name)
指定空约束?
在向表添加约束的PostgreSQL语法中是否存在不一致? 这是否属于SQL标准?
答案 0 :(得分:2)
ADD
之后的单词有所不同,因此数据库知道您的意思。例如。 CHECK
引入了通用布尔条件; UNIQUE
后跟一列名称; FOREIGN KEY
后跟一列名REFERENCES
和一个目标表/列。如果没有这些关键字,您将意味着哪种约束将是模棱两可的。
CONSTRAINT constraint_name
语法不限于唯一约束。请参阅https://www.postgresql.org/docs/10/static/sql-createtable.html中 column_constraint
和 table_constraint
的定义;两者都允许使用可选的前导CONSTRAINT constraint_name
来命名约束。
关于NOT NULL
,请参见https://www.postgresql.org/docs/10/static/ddl-constraints.html#id-1.5.4.5.6:
非空约束始终被写为列约束。 非空约束在功能上等同于创建检查约束
CHECK (column_name IS NOT NULL)
,但在PostgreSQL中,创建显式非空约束效率更高。缺点是您不能为通过这种方式创建的非空约束指定明确的名称。
我假设非null约束在内部是一种特殊情况,与可以使用任何布尔表达式的通用CHECK
约束相比,它可以提供更好的优化。
答案 1 :(得分:1)
我们不能对Not Null使用添加约束语法。您必须使用修改列语法来添加非null 例如。 alter table修改(不为null);