在SQLite中创建后可以更改列约束吗?

在SQLite中创建后可以更改列约束吗?,sqlite,Sqlite,假设我创建了这样一个表: CREATE TABLE table_1(column_1 UNIQUE, column_2 NOT NULL); 现在,在我插入了大量数据之后,出于某种原因,我需要从第一列(即列_1)中删除唯一约束。可能吗?如果是,如何操作?SQLite不支持此操作 最好的方法是将数据库导出为文本(sqlite3工具中的.dump),删除UNIQUE构造函数,然后重新创建数据库。中的ALTER TABLE非常有限 但是,您可以在一定程度上使用CREATE INDEX和CREATE

假设我创建了这样一个表:

CREATE TABLE table_1(column_1 UNIQUE, column_2 NOT NULL);
现在,在我插入了大量数据之后,出于某种原因,我需要从第一列(即列_1)中删除唯一约束。可能吗?如果是,如何操作?

SQLite不支持此操作


最好的方法是将数据库导出为文本(
sqlite3
工具中的
.dump
),删除
UNIQUE
构造函数,然后重新创建数据库。

中的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