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()
的输出按顺序由以下列组成 -
id
、seq
、table
、from
、to
、on_update
、on_delete
、match
因此,在输出中,您得到的前两个 0
用于 id
和 seq
。
以下示例在 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
值不同,因为键中有多个列。
使用具有以下架构的 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()
的输出按顺序由以下列组成 -
id
、seq
、table
、from
、to
、on_update
、on_delete
、match
因此,在输出中,您得到的前两个 0
用于 id
和 seq
。
以下示例在 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
值不同,因为键中有多个列。