说我已经创建了一个表是这样的:在SQLite中创建后是否可以更改列约束?
CREATE TABLE table_1(column_1 UNIQUE, column_2 NOT NULL);
现在我已经插入大量的数据后,由于某种原因,我需要从第一列中删除唯一约束,这是COLUMN_1。可能吗?如果是,如何?
说我已经创建了一个表是这样的:在SQLite中创建后是否可以更改列约束?
CREATE TABLE table_1(column_1 UNIQUE, column_2 NOT NULL);
现在我已经插入大量的数据后,由于某种原因,我需要从第一列中删除唯一约束,这是COLUMN_1。可能吗?如果是,如何?
SQLite的ALTER TABLE statement不支持这一点。
最好的办法是将数据库导出为文本(sqlite3
工具中的.dump
),删除UNIQUE
常量并重新创建数据库。
ALTER TABLE
in sqlite是非常有限的。
但是,您可以在一定程度上使用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