PostgreSQL向表添加约束的语法是否存在不一致?

时间:2018-07-05 03:33:31

标签: sql postgresql

来自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标准?

2 个答案:

答案 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);