输出SQLite的foreign_key_list pragma

时间:2017-06-07 23:48:01

标签: sqlite foreign-keys 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没有说明此pragma输出的含义,除了显而易见的( Customers - Parent表, CustomerID - 子键, ID - 父键, RESTRICT - ON DELETE和第二个 RESTRICT - ON UPDATE)我认为 NONE 对应不受支持的MATCH条款。

我自己无法弄清楚的是前两个零的含义。有人能告诉我它是什么吗?

1 个答案:

答案 0 :(得分:1)

PRAGMA foreign_key_list()的输出按顺序包含以下列 -

idseqtablefromtoon_updateon_deletematch

因此,在输出中,前两个0用于idseq

使用下面带有标题和列选项的sqlite3 cli中执行的示例 -

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 

我知道桌子Test看起来像个噩梦,但暂时忽略了可怕的架构。

您可以看到表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值因密钥中有多列而不同。