162

次の表があります。

CREATE TABLE child( 
  id INTEGER PRIMARY KEY, 
  parent_id INTEGER, 
  description TEXT);

に外部キー制約を追加するにはどうすればよいparent_idですか? 外部キーが有効になっていると仮定します。

ほとんどの例では、テーブルを作成していることを前提としています - 既存の制約に制約を追加したいと思います。

4

12 に答える 12

240

できません。

テーブルに外部キーを追加するための 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 )

于 2009-12-10T23:26:55.957 に答える
69

テーブルを変更し、制約を使用する列を追加すると、制約を追加できます。

まず、parent_id なしでテーブルを作成します。

CREATE TABLE child( 
  id INTEGER PRIMARY KEY,  
  description TEXT);

次に、テーブルを変更します。

ALTER TABLE child ADD COLUMN parent_id INTEGER REFERENCES parent(id);
于 2014-05-09T21:12:19.950 に答える
1

既存の 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;

他のテーブルからも外部キーを追加できます。

于 2020-10-11T22:15:08.417 に答える
-2

基本的にはできませんが、状況を回避することはできます。

外部キー制約を既存のテーブルに追加する正しい方法は、次のコマンドです。

db.execSQL("alter table child add column newCol integer REFERENCES parent(parent_Id)");

次に、parent_Idデータを newCol にコピーしてから、Parent_Idを削除します。したがって、一時テーブルは必要ありません。

于 2016-11-20T07:05:12.520 に答える