【发布时间】:2019-08-10 11:34:48
【问题描述】:
假设我们有一些简单的代码,例如:
CREATE TABLE tab(
id INT NOT NULL PRIMARY KEY,
CONSTRAINT greater_than_10 CHECK (id > 10)
);
定义了具有单列和约束的表。现在如果我们切换顺序:
CREATE TABLE tab(
CONSTRAINT greater_than_10 CHECK (id > 10),
id INT NOT NULL PRIMARY KEY
);
元数据更新不成功 CREATE TABLE TAB 失败 动态 SQL 错误 SQL 错误代码 = -206 列未知 ID
或:
[IBM][CLI Driver][DB2/LINUXX8664] SQL0205N 列、属性或句点“ID”未在“FIDDLE_QSNXRANMEEPHZPWEWQDV.TAB”中定义。 SQLSTATE=42703 SQLCODE=-205
这种行为在任何其他主要的 RDBMS 中都不存在:
db<>fiddle demo - Oracle - db<>fiddle demo - SQL Server - db<>fiddle demo - PostgreSQL
编辑:
同样适用于引用同一张表的外键:
-- here I could define columns in any order, neat feature
CREATE TABLE comments(
comment_id INT REFERENCES comments(id),
id INT PRIMARY KEY
);
存在引用不存在的对象的想法,例如:T-SQL 存储过程延迟名称解析或 C/C++ 前向声明。
编辑 2:
这种行为甚至适用于计算列:
-- SQL Server
CREATE TABLE t(
col AS (id + 1),
id INT
);
-- PostgreSQL 12
CREATE TABLE t(
col INT GENERATED ALWAYS AS (id + 1) STORED,
id INT
);
-- Oracle/MySQL 8.0/MariaDB 10.4
CREATE TABLE t(
col INT AS (id + 1),
id INT
);
搜索官方文档/ISO,说明在同一级别定义条目的特定顺序是否是强制性的。
【问题讨论】:
-
那么,问题是......?
-
@BarbarosÖzhan 问题是这种行为是否符合标准。
-
@LukashSzozda 。 . .我很惊讶在尚未定义的列上定义约束适用于任何数据库。我什至不会考虑以这种方式编写 SQL。我想该标准对这个特定主题没有太多要说的;它可能相当模棱两可。
-
据我所知,快速浏览一下,SQL 标准 (ISO/IEC 9075-2:2016) 没有说明任何内容。 11.3
中的措辞不够具体,无法明确说明是否允许,甚至是否需要。
CREATE TABLE comments( comment_id INT REFERENCES comments(id),- 在 Firebird 上创建自引用表很危险,可能导致服务器崩溃。保持警惕。
标签: sql db2 firebird create-table