web-dev-qa-db-ja.com

SQLite(3.6.21)テーブルから制約を削除するにはどうすればよいですか?

次の表があります。

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

制約を削除するにはどうすればよいですか?

51
Dane O'Connor

SQLiteは(この回答の時点では)alter table drop constraintコマンドをサポートしていません。許可された構文は here で確認できます。制約のない新しいテーブルを作成し、データを転送してから、古いテーブルを削除する必要があります。

私は次のようなものがうまくいくと思います:

CREATE TABLE child2 ( 
    id          INTEGER PRIMARY KEY, 
    parent_id   INTEGER,
    description TEXT
);
INSERT INTO child2 (id, parent_id, description)
   SELECT id, parent_id, description FROM CHILD;
DROP TABLE child;
ALTER TABLE child2 RENAME TO child;

insert intonotに簡略化できる可能性があることに注意してください。明示的な列名を使用しますが、構造も変更する場合に備えてそのままにしておきます。

たとえば、removingparent_id列の制約である場合、それをそのままにしておくのは疑わしい使用法です。その場合、データ転送を次のように変更できます。

CREATE TABLE child2 (id INTEGER PRIMARY KEY, description TEXT);
INSERT INTO child2 (id, description) SELECT id, description FROM CHILD;
85
paxdiablo

これは、より簡単で簡潔なアプローチだと思います。

copy db.sqlite3 backup-db.sqlite3
echo .dump tablename | sqlite3 db.sqlite3 > modify.sql
(now delete or change the constraint in modify.sql)
echo drop table tablename; | sqlite3 db.sqlite3 
sqlite3 db.sqlite3 < modify.sql

これで、新しいデータベーステーブルを再ダンプして、違いを比較できます。

8
jftuga