3

設定しましたPRAGMA foreign_keys=ON;

sqlite3 テーブルのいくつかのレコードを削除しようとしていますが、表示されますError: constraint failed

sqlite> delete from auth_user where id = 110;
Error: constraint failed

PRAGMA foreign_keysがOFFの場合に動作します。データベースには非常に多くのテーブルがあり、エラーは非常にあいまいです。削除しようとすると、他のデータベース システムでは主キーを参照するテーブルがリストされると思います。

特定の主キー id=110 を参照するすべてのテーブルを見つける効率的な方法は何ですか?

スキーマ:

CREATE TABLE "auth_user" (
    "id" integer NOT NULL PRIMARY KEY,
    "username" varchar(30) NOT NULL UNIQUE,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL,
    "password" varchar(128) NOT NULL,
    "is_staff" bool NOT NULL,
    "is_active" bool NOT NULL,
    "is_superuser" bool NOT NULL,
    "last_login" datetime NOT NULL,
    "date_joined" datetime NOT NULL
);
4

1 に答える 1

5

SQLite で外部キー制約を一覧表示する明確な方法はないと思います。ただし、以下に示すような制約を持つすべてのテーブルを一覧表示できます。その後、返された SQL を解析して制約を見つけることができます。

2 つの親子テーブルがあるとします。

sqlite> PRAGMA foreign_keys=ON;
sqlite> create table Parent (
   ...>     Id INTEGER PRIMARY KEY AUTOINCREMENT, 
   ...>     foo TEXT);
sqlite> create table Child (
   ...>     Id INTEGER PRIMARY KEY AUTOINCREMENT, 
   ...>     ParentId INTEGER NOT NULL, 
   ...>     bar TEXT,
   ...>     FOREIGN KEY (ParentId) REFERENCES Parent(Id));

CREATE TABLE外部キーを持つステートメントを一覧表示できます。

sqlite> SELECT sql FROM sqlite_master WHERE sql LIKE '%REFERENCES%';
CREATE TABLE Child (
    Id INTEGER PRIMARY KEY AUTOINCREMENT, 
    ParentId INTEGER NOT NULL, 
    bar TEXT,
    FOREIGN KEY (ParentId) REFERENCES Parent(Id))

これはすでにご存知かもしれませんが、外部キーがオフになっているときに外部キーが制約されている行を削除すると、データベースの参照整合性が損なわれるため、そうしないようにアドバイスすることしかできません。

于 2012-08-28T09:10:09.003 に答える