SQLite - 命名约束语法
SQLite - named constraint syntax
我想知道为什么以下语法有效:
CREATE TABLE tab1(id INT,
PRIMARY KEY (id) CONSTRAINT PK_tab1
-- here the CONSTRAINT is after PRIMARY KEY def
);
CREATE TABLE tab3(id INT,
CHECK(id > 10) CONSTRAINT CHK_tab3_id
);
通常我会期望:
CREATE TABLE tab2(id INT,
CONSTRAINT PK_tab2 PRIMARY KEY (id)
);
根据文档,语法似乎无效:
对于PostgreSQL/Oracle/MySQL/SQL服务器上面的语法returns错误:db<>fiddle demo PostgreSQL
这是与 DB2/Informix 的某种兼容模式吗?
你遗漏的在column-def
图中。
注意 column-constraint
部分中的循环;单个列可以有多个约束。所以你的第一个例子有主键,然后是第二个命名约束,它实际上没有应用任何实际规则 - 这是不寻常的一点,因为图表表明不应该被允许。然而,sqlite3 解析器在列定义方面非常、非常、非常宽容,并且允许官方语法图建议它不应该做的事情。
我想知道为什么以下语法有效:
CREATE TABLE tab1(id INT,
PRIMARY KEY (id) CONSTRAINT PK_tab1
-- here the CONSTRAINT is after PRIMARY KEY def
);
CREATE TABLE tab3(id INT,
CHECK(id > 10) CONSTRAINT CHK_tab3_id
);
通常我会期望:
CREATE TABLE tab2(id INT,
CONSTRAINT PK_tab2 PRIMARY KEY (id)
);
根据文档,语法似乎无效:
对于PostgreSQL/Oracle/MySQL/SQL服务器上面的语法returns错误:db<>fiddle demo PostgreSQL
这是与 DB2/Informix 的某种兼容模式吗?
你遗漏的在column-def
图中。
注意 column-constraint
部分中的循环;单个列可以有多个约束。所以你的第一个例子有主键,然后是第二个命名约束,它实际上没有应用任何实际规则 - 这是不寻常的一点,因为图表表明不应该被允许。然而,sqlite3 解析器在列定义方面非常、非常、非常宽容,并且允许官方语法图建议它不应该做的事情。