SQLite 支持的唯一 DROP 语句是:-
ALTER TABLE 语句相对有限:-
因此,您需要重新创建表格,减少约束。
以下可能是这样做的基础:-
CREATE TABLE IF NOT EXISTS new_users (users_customer_id_email_unique TEXT,users_customer_id_trigram_unique INTEGER, othercolumn);
INSERT INTO new_users SELECT * FROM users;
DROP TABLE IF EXISTS old_users;
ALTER TABLE users RENAME TO old_users; /* could be dropped instead of altered but safer to alter then drop */
ALTER TABLE new_users RENAME TO users;
DROP TABLE IF EXISTS old_users;
工作示例
也许可以根据您的代码考虑以下示例。请注意,这还包括一些可能有用的附加功能,例如提取删除了 UNIQUE(所有出现)的 sql。
DROP TABLE IF EXISTS old_users;
DROP TABLE IF EXISTS users;
CREATE TABLE IF NOT EXISTS users (users_customer_id_email_unique TEXT UNIQUE,users_customer_id_trigram_unique INTEGER UNIQUE, othercolumn);
INSERT INTO users VALUES ('a@email.com',1,'blah'),('b@email.com',2,'blah'),('c@email.com',3,'blah');
/* try to addd some duplicate data (will not be added) */
INSERT OR IGNORE INTO users VALUES ('a@email.com',1,'blah'),('b@email.com',2,'blah'),('c@email.com',3,'blah');
/*RESULT 1 - data in table before removing unique constraint */
SELECT * FROM users;
/* Potentially useful extras that could be used in generating SQL for new table */
SELECT replace(replace(sql,' UNIQUE',''),' unique','') AS newsql FROM sqlite_master WHERE name = 'users';
SELECT * FROM pragma_table_info('users');
/* The actual constraint removal using hard coded replacement table */
CREATE TABLE IF NOT EXISTS new_users (users_customer_id_email_unique TEXT,users_customer_id_trigram_unique INTEGER, othercolumn);
INSERT INTO new_users SELECT * FROM users; /* populate the replacement table */
DROP TABLE IF EXISTS old_users; /* just in case */
ALTER TABLE users RENAME TO old_users; /* could DROP the table here instead of ALTER and subsequent DROP */
ALTER TABLE new_users RENAME TO users;
DROP TABLE IF EXISTS old_users;
/* Add some duplicate rows */
INSERT OR IGNORE INTO users VALUES ('a@email.com',1,'blah'),('b@email.com',2,'blah'),('c@email.com',3,'blah');
/* END RESULTS */
SELECT * FROM users;
SELECT * FROM sqlite_master WHERE name = 'users' OR tbl_name = 'users';
SELECT * FROM pragma_table_info('users');
/* Cleanup Testing Environment */
DROP TABLE IF EXISTS users;
结果:-
原表中的数据
Extra - 删除 UNQIUE 的替换 SQL 示例
额外 - 原始表格中的列信息
修改后的表格数据(添加了重复数据)
新表的 SQL(也显示 UNIQUE 列的索引已被删除)
替换表的列