既存のテーブルからUnique Keyを外す(SQlite, javascript)

SQL

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

https://sqlite.org/lang_altertable.html#altertabmvcol

コメント