SQLite 的 foreign_key_list pragma 的输出

Output of the SQLite's foreign_key_list pragma

使用具有以下架构的 SQLite3

CREATE TABLE Customers(ID INTEGER PRIMARY KEY, Company TEXT NOT NULL UNIQUE, Country TEXT NOT NULL, City TEXT NOT NULL);
CREATE TABLE Orders(ID INTEGER PRIMARY KEY, CustomerID INTEGER NOT NULL, FOREIGN KEY(CustomerID) REFERENCES Customers(ID) ON DELETE RESTRICT ON UPDATE RESTRICT);

并发出此命令:

PRAGMA foreign_key_list(Orders);

产生以下输出:

0|0|Customers|CustomerID|ID|RESTRICT|RESTRICT|NONE

由于 documentation 除了明显的 (Customers - Parent table, CustomerID - 子键,ID - 父键,RESTRICT - 删除和第二个 RESTRICT - 更新时)我认为 NONE 对应于不受支持的 MATCH 子句。

我自己搞不懂的是前两个零的意思。谁能告诉我这是什么?

PRAGMA foreign_key_list() 的输出按顺序由以下列组成 -

idseqtablefromtoon_updateon_deletematch

因此,在输出中,您得到的前两个 0 用于 idseq

以下示例在 sqlite3 cli 中执行,header 和列选项 -

CREATE TABLE Test (first INTEGER, second INTEGER, FOREIGN KEY (first) REFERENCES A(a) ON DELETE CASCADE, FOREIGN KEY (second) REFERENCES B(x) ON DELETE CASCADE);
sqlite> 
sqlite> PRAGMA foreign_key_list(Test);
id          seq         table       from        to          on_update   on_delete   match     
----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------
0           0           B           second      x           NO ACTION   CASCADE     NONE      
1           0           A           first       a           NO ACTION   CASCADE     NONE 

我知道 table Test 看起来像一场噩梦,但暂时忽略可怕的模式。

您可以看到 table Test 中有两个外键,因此 PRAGMA foreign_key_list() 输出中显示了两个条目。您可以看到 id 字段值分别为 0 和 1,但 seq 值均为 0。

正如您所知,sqlite 允许在外键语句中使用多个列名。 所以如果你拿下一个例子 -

sqlite> CREATE TABLE Test2 (first INTEGER, second INTEGER, FOREIGN KEY (first, second) REFERENCES A(a, b) ON DELETE CASCADE);
sqlite> 
sqlite> PRAGMA foreign_key_list(Test2);
id          seq         table       from        to          on_update   on_delete   match     
----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------
0           0           A           first       a           NO ACTION   CASCADE     NONE      
0           1           A           second      b           NO ACTION   CASCADE     NONE  

因此,多列键会在输出中产生多行,其中 id 与这实际上是一个键相同。但是 seq 值不同,因为键中有多个列。