3

groupsという名前のテーブルがあり、その列の 1 つの名前を変更したいと考えています。これまでのところ、大丈夫でした。sqliteが列の名前変更をサポートしていないことを知っているので、次のようにしました。

ALTER TABLE groups RENAME to tmp_groups;

CREATE TABLE groups(
    _ID integer primary key autoincrement,
    new_column_name integer
);

INSERT INTO groups(_ID, new_column_name) SELECT _ID, old_column_name FROM tmp_groups;

DROP TABLE tmp_groups;

しかし、テーブルtmp_groupsを削除すると、外部キーを持つテーブルmembersON DELETE CASCADEのレコードも削除されるため、次のことを行う必要がありました。

  1. メンバーと同じ列を持ち、外部キーを持たないテーブルtmp_membersを作成します。
  2. メンバーからのレコードをtmp_members に挿入します。
  3. テーブルメンバーを削除します。
  4. 最初の部分からコードを実行します (グループテーブルを使用)。
  5. 外部キーを使用してテーブル メンバーを再作成します。
  6. tmp_membersのメンバーデータに挿入します。

男、それは疲れた!単純に列の名前を変更するにはコードが多すぎます。

この制約の問題を処理する簡単な方法はありますか、それとも「sqlite の方法」ですか?

4

1 に答える 1

3

歴史的な理由から、SQLite では外部キー制約を無効にすることができます (これは現在のデフォルトでもあります)。

テーブルの処理を行う前に、PRAGMAforeign_keys = offを実行してgroupsください。


PRAGMA writable_schemaを使用して列の名前を変更することもできますが、これは自分が何をしているのかわかっている場合にのみ行うべきです。

于 2014-08-20T07:55:07.483 に答える