5

次のようなテーブルを作成したとします。

CREATE TABLE table_1(column_1 UNIQUE, column_2 NOT NULL);

大量のデータを挿入した後、何らかの理由で、最初の列 (column_1) から UNIQUE 制約を削除する必要があります。出来ますか?はいの場合、どのように?

4

2 に答える 2

6

ALTER TABLEでは非常に制限されています。

CREATE INDEXただし、制限付きで、およびを使用して一部の制約を変更できますCREATE TRIGGER

たとえば、次のことができます。

CREATE TABLE table_1(column_1, column_2);
-- No constrains in table_1
CREATE UNIQUE INDEX t1_c1_1 ON table_1 (column_1);
-- From now, column_1 must be UNIQUE
CREATE TRIGGER t1_c2_1i BEFORE INSERT ON table_1 WHEN column_2 IS NULL BEGIN
    SELECT RAISE(ABORT, 'column_2 can not be NULL');
END;
CREATE TRIGGER t1_c2_1u BEFORE UPDATE ON table_1 WHEN column_2 IS NULL BEGIN
    SELECT RAISE(ABORT, 'column_2 can not be NULL');
END;
-- From now, NULL column_2 update/insert will fail
DROP TRIGGER t1_c1_1;
-- Now column_1 doesn't need to be UNIQUE
DROP TRIGGER t1_c2_1i;
DROP TRIGGER t1_c2_1u;
-- Now column_2 may be NULL

ノート:

  • 既存の制約を削除することはできません。
  • インデックスを作成すると、データ (インデックス データ) が大きくなります。
  • トリガーを作成すると、テーブルのパフォーマンスが低下する場合があります。

別の回避策は、制約を削除して既存のテーブルを複製することです。

CREATE TEMP TABLE table_1 AS SELECT * FROM MAIN.table_1;
DROP TABLE table_1;
CREATE TABLE table_1 AS SELECT * FROM TEMP.table1;
-- table_1 is now a copy from initial table_1, but without constraints
于 2013-09-30T12:38:56.537 に答える
5

SQLite のALTER TABLE ステートメントはこれをサポートしていません。

最善の策は、データベースをテキストとして (ツール.dumpで) エクスポートし、定数を削除して、データベースを再作成することです。sqlite3UNIQUE

于 2013-09-29T20:36:59.877 に答える