首页 > 解决方案 > 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 标准?

标签: sqlpostgresql

解决方案


后面的词ADD不同,所以数据库知道你的意思。例如CHECK,引入了一个通用的布尔条件;UNIQUE后面是列名列表;FOREIGN KEY后跟一个列名 ,REFERENCES和一个目标表/列。如果没有这些关键字,您所指的是哪种约束将是模棱两可的。

语法不限于唯一约束。参见https://www.postgresql.org/docs/10/static/sql-createtable.html中和的定义;两者都允许一个可选的前导来命名约束。CONSTRAINT constraint_namecolumn_constrainttable_constraintCONSTRAINT 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 中创建显式非空约束更有效。缺点是您不能为以这种方式创建的非空约束提供显式名称。

我假设非空约束在内部是一种特殊情况,允许比CHECK可以使用任何布尔表达式的通用约束更好的优化。


推荐阅读