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 标准?
解决方案
后面的词ADD
不同,所以数据库知道你的意思。例如CHECK
,引入了一个通用的布尔条件;UNIQUE
后面是列名列表;FOREIGN KEY
后跟一个列名 ,REFERENCES
和一个目标表/列。如果没有这些关键字,您所指的是哪种约束将是模棱两可的。
语法不限于唯一约束。参见https://www.postgresql.org/docs/10/static/sql-createtable.html中和的定义;两者都允许一个可选的前导来命名约束。CONSTRAINT constraint_name
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 中创建显式非空约束更有效。缺点是您不能为以这种方式创建的非空约束提供显式名称。
我假设非空约束在内部是一种特殊情况,允许比CHECK
可以使用任何布尔表达式的通用约束更好的优化。
推荐阅读
- php - PHP regex 获取 data-id 属性
- python - 如何使用 ThreadPoolExecutor 跟踪输入参数和结果
- python - 为什么在执行后我的 tkinter 计算器 GUI 中添加了 = 符号?
- reactjs - 使用 SocketIO 的异步上下文做出反应
- django - 在 django 管理面板中触发保存方法时如何发送电子邮件
- go - 从字符串到符文切片的转换是否会复制?
- javascript - 如何从响应正文中获取后端的角度排序列表?
- xcode - 删除应用后取消 Xcode 更新安装
- scala - Scala slick left innerjoin 用于相同的 Postgres 表不起作用
- kaggle - 解析错误(文本 = x,srcfile = src):
:13:6: 意外符号 12: 13: 这个 R ^