Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the names of foreign key constraints in SQLite?

Tags:

sqlite

Does SQLite indeed have a limitation that it is not possible to retrieve the name of a foreign key? I am asking because I couldn't find this limitation mentioned anywhere in their documentation.

For example, I run the following script:

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)
) ;

Now I would like to check that the key "fk_users" was created indeed, so I run the following PRAGMA:

PRAGMA foreign_key_list(orders);

I would expect to see the name of my foreign key in the first column, but I am seeing some "0" value instead. Moreover, if I create multiple foreign keys with custom names, they are all called either "0" or "1".

Is this indeed a limitation of SQLite, or am I missing something?

like image 724
Roman T Avatar asked Jan 11 '17 15:01

Roman T


People also ask

How do you identify foreign key constraints?

Open the Table Designer for the table containing the foreign key you want to view, right-click in the Table Designer, and choose Relationships from the shortcut menu. In the Foreign Key Relationships dialog box, select the relationship with properties you want to view.

What are foreign key constraints in SQLite?

The SQLite foreign key is a constraint that verifies the existence of value present in one table to another table that has a relation with the first table where the foreign key is defined. While working with multiple tables, when there are two tables that relate to each other with one column in common.

Are there foreign keys in SQLite?

SQLite has supported foreign key constraint since version 3.6. 19.

What is foreign key constraint name?

A foreign key constraint specifies that the key can only contain values that are in the referenced primary key, and thus ensures the referential integrity of data that is joined on the two keys. You can identify a table's foreign key when you create the table, or in an existing table with ALTER TABLE .


2 Answers

There is no mechanism to extract the constraint name.

like image 112
CL. Avatar answered Oct 30 '22 02:10

CL.


The table sqlite_master stores a CREATE command in the column "sql". You could query that command and do some parsing to extract the name of the foreign key. An example for a combined foreign key that works for me:

SELECT sql FROM sqlite_master WHERE name = 'song'

yields

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

and contains the name "fk__song_album" of the foreign key.

If one alters the foreign key with a query, the content of the sql column is modified/updated:

The text in the sqlite_master.sql column is a copy of the original CREATE statement text that created the object, except normalized as described above and as modified by subsequent ALTER TABLE statements. The sqlite_master.sql is NULL for the internal indexes that are automatically created by UNIQUE or PRIMARY KEY constraints.

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

Extra tip: In order to see the foreign key information in Navicat (Lite) ... right click on a table and choose "Design table". Then select the foreign keys tab.

enter image description here

like image 28
Stefan Avatar answered Oct 30 '22 01:10

Stefan