SQliteではAlterTableでさっくりUnique Constraintを外す、ということはできません。
AlterTableの機能が限られているため、制約を外す場合は基本的にテーブルを作り直します。
具体的にはRENAME TOで別名に一旦変更し、新たに制約なしでCREATE TABLEします。
その後、renameしたTableからSelect *でINSERTして完了です。
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table1 RENAME TO oldTable1;
CREATE TABLE IF NOT EXISTS table1(
id INTEGER PRIMARY KEY,
title TEXT,
-- title TEXT NOT NULL UNIQUE,
updated_at TEXT NOT NULL DEFAULT(DATETIME('now', 'localtime'))
)
INSERT INTO table1 SELECT * FROM oldTable1;
COMMIT;
PRAGMA foreign_keys=on;
これで無事にテーブルがコピーされました。
念のためoldTable1を消さずに残しているので最後にDROP TABLEすれば終了です。
なお外部キー制約が貼ってある場合も同様です。
上記のようにTableの変更を起こった場合、oldTable1に外部キーの参照があった場合、自動的には新しいtable1に制約が移動したりはせず、古い参照が残り続けます。
その場合、oldTable1への外部キー制約を持つテーブルを上記と同じように作り直す必要があります。
外部キー制約が残っているとDROP TABLEできません(PRAGMA foreign_keys=onの場合)。
下のリンクのこの辺を参照。
5. Making Other Kinds Of Table Schema Changes
6. Why ALTER TABLE is such a problem for SQLite
ALTER TABLE
コメント