2017-01-11 37 views
1

SQLite確實有一個限制,它不可能檢索外鍵的名稱?我在問,因爲我找不到在他們的文檔中提到的任何限制。如何在SQLite中獲取外鍵約束的名稱?

例如,我運行下面的腳本:

CREATE TABLE 
     users (
     id INTEGER NOT NULL PRIMARY KEY, 
     first_name TEXT NOT NULL, 
     last_name TEXT NOT NULL 
) ; 

CREATE TABLE 
     orders (
     id INTEGER NOT NULL PRIMARY KEY,  
     user_id INTEGER NOT NULL,  
     CONSTRAINT fk_users FOREIGN KEY (user_id) REFERENCES users(id) 
) ; 

現在我想檢查鍵「fk_users」的確創造,所以我運行下面的PRAGMA:

PRAGMA foreign_key_list(orders); 

我期望在第一列中看到我的外鍵的名稱,但我看到一些「0」值。而且,如果我使用自定義名稱創建多個外鍵,則它們都被稱爲「0」或「1」。

這確實是SQLite的限制,還是我錯過了什麼?

回答

1

沒有提取約束名稱的機制。

0

表sqlite_master在「sql」列中存儲CREATE命令。您可以查詢該命令並執行一些解析來提取外鍵的名稱。對於爲我的作品組合外鍵的一個例子:

SELECT sql FROM sqlite_master WHERE name = 'song' 

產生

CREATE TABLE "song" (
"songid" INTEGER, 
"songartist" TEXT, 
"songalbum" TEXT, 
"songname" TEXT, 
CONSTRAINT "fk__song_album" FOREIGN KEY ("songartist", "songalbum") REFERENCES "album" ("albumartist", "albumname") 
) 

,幷包含外鍵的名稱「fk__song_album」。

如果一個人改變了查詢的外鍵,則SQL列的內容被修改/更新:

在sqlite_master.sql列中的文本是創建原始CREATE語句文本的副本該對象除了如上所述被標準化並且被隨後的ALTER TABLE語句修改之外。對於由UNIQUE或PRIMARY KEY約束自動創建的內部索引,sqlite_master.sql爲NULL。

https://www.sqlite.org/fileformat2.html

額外提示: 爲了看到在Navicat(精簡版)的外鍵信息,右鍵單擊表,然後選擇「設計表」。然後選擇外鍵選項卡。

enter image description here