将 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条款。
我自己无法弄清楚的是前两个零的含义。有人能告诉我它是什么吗?
答案 0 :(得分:1)
PRAGMA foreign_key_list()
的输出按顺序包含以下列 -
id
,seq
,table
,from
,to
,on_update
,on_delete
,match
因此,在输出中,前两个0
用于id
和seq
。
使用下面带有标题和列选项的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
值因密钥中有多列而不同。