次の表があります。
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
に外部キー制約を追加するにはどうすればよいparent_id
ですか? 外部キーが有効になっていると仮定します。
ほとんどの例では、テーブルを作成していることを前提としています - 既存の制約に制約を追加したいと思います。
次の表があります。
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
に外部キー制約を追加するにはどうすればよいparent_id
ですか? 外部キーが有効になっていると仮定します。
ほとんどの例では、テーブルを作成していることを前提としています - 既存の制約に制約を追加したいと思います。
できません。
テーブルに外部キーを追加するための SQL-92 構文は次のようになりますが、
ALTER TABLE child ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id)
REFERENCES parent(id);
SQLite はコマンドのADD CONSTRAINT
変形をサポートしていません( sqlite.org: SQL Features That SQLite Does Not Implemented )。ALTER TABLE
したがって、sqlite 3.6.1 で外部キーを追加する唯一の方法はCREATE TABLE
次のとおりです。
CREATE TABLE child (
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
);
残念ながら、既存のデータを一時テーブルに保存し、古いテーブルを削除し、FK 制約を使用して新しいテーブルを作成し、一時テーブルからデータをコピーして戻す必要があります。( sqlite.org - FAQ: Q11 )
テーブルを変更し、制約を使用する列を追加すると、制約を追加できます。
まず、parent_id なしでテーブルを作成します。
CREATE TABLE child(
id INTEGER PRIMARY KEY,
description TEXT);
次に、テーブルを変更します。
ALTER TABLE child ADD COLUMN parent_id INTEGER REFERENCES parent(id);
既存の SQLLite テーブルへの外部キーを作成します。
SQL LITE でこれを行う直接的な方法はありません。以下のクエリを実行して、外部キーを持つ STUDENTS テーブルを再作成します。最初の STUDENTS テーブルを作成し、テーブルにデータを挿入した後、クエリを実行します。
CREATE TABLE STUDENTS (
STUDENT_ID INT NOT NULL,
FIRST_NAME VARCHAR(50) NOT NULL,
LAST_NAME VARCHAR(50) NOT NULL,
CITY VARCHAR(50) DEFAULT NULL,
BADGE_NO INT DEFAULT NULL
PRIMARY KEY(STUDENT_ID)
);
STUDENTS テーブルにデータを挿入します。
次に FOREIGN KEY を追加します:同じ STUDENTS テーブルの外部キーとして BADGE_NO を作成します
BEGIN;
CREATE TABLE STUDENTS_new (
STUDENT_ID INT NOT NULL,
FIRST_NAME VARCHAR(50) NOT NULL,
LAST_NAME VARCHAR(50) NOT NULL,
CITY VARCHAR(50) DEFAULT NULL,
BADGE_NO INT DEFAULT NULL,
PRIMARY KEY(STUDENT_ID) ,
FOREIGN KEY(BADGE_NO) REFERENCES STUDENTS(STUDENT_ID)
);
INSERT INTO STUDENTS_new SELECT * FROM STUDENTS;
DROP TABLE STUDENTS;
ALTER TABLE STUDENTS_new RENAME TO STUDENTS;
COMMIT;
他のテーブルからも外部キーを追加できます。
基本的にはできませんが、状況を回避することはできます。
外部キー制約を既存のテーブルに追加する正しい方法は、次のコマンドです。
db.execSQL("alter table child add column newCol integer REFERENCES parent(parent_Id)");
次に、parent_Idデータを newCol にコピーしてから、Parent_Id列を削除します。したがって、一時テーブルは必要ありません。