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

db<>fiddle SQLite demo

根据文档,语法似乎无效:

CREATE TABLE table_constraint


对于PostgreSQL/Oracle/MySQL/SQL服务器上面的语法returns错误:db<>fiddle demo PostgreSQL

这是与 DB2/Informix 的某种兼容模式吗?

你遗漏的在column-def图中。

注意 column-constraint 部分中的循环;单个列可以有多个约束。所以你的第一个例子有主键,然后是第二个命名约束,它实际上没有应用任何实际规则 - 这是不寻常的一点,因为图表表明不应该被允许。然而,sqlite3 解析器在列定义方面非常、非常、非常宽容,并且允许官方语法图建议它不应该做的事情。