Mysql SQLite多列唯一约束允许重复
我正在将MySQL数据库移植到SQLite,但SQLite在允许重复值方面遇到了问题Mysql SQLite多列唯一约束允许重复,mysql,sqlite,Mysql,Sqlite,我正在将MySQL数据库移植到SQLite,但SQLite在允许重复值方面遇到了问题 CREATE TABLE altnames ( Prime CHAR (20), Alternate CHAR (20), UNIQUE ( Prime, Alternate ) ); CREATE INDEX prime ON altnames ( Prime ); CREATE INDEX alternate ON altnames ( Alternate
CREATE TABLE altnames (
Prime CHAR (20),
Alternate CHAR (20),
UNIQUE ( Prime, Alternate )
);
CREATE INDEX prime ON altnames ( Prime );
CREATE INDEX alternate ON altnames ( Alternate );
CREATE UNIQUE INDEX Combined ON altnames (
Prime,
Alternate
);
我使用HeidiSQL导出到CSV,并使用SQLiteStudio从那里导入。它将捕获我手动输入的值的副本,但一旦我从MySQL表导入数据,它就不会捕获这些值的副本
该表的目的是链接各种形式的名称。一些样本数据:
"Al","Alan"
"Al","Albert"
"Al","Alfred"
"Al","Allan"
"Al","Allen"
"Al","Alvin"
"Alan","Al"
"Alan","Allan"
"Alan","Allen"
"Albert","Al"
"Albert","Bert"
"Albert","Bertie"
"Alfred","Al"
"Alfred","Fred"
"Alfred","Freddie"
"Alfred","Freddy"
"Allan","Al"
"Allan","Alan"
"Allan","Allen"
"Allen","Al"
"Allen","Alan"
"Allen","Allan"
如果我通过SQLiteStudio接口或以编程方式添加这些项,则会触发约束,但如果我导入它们,则这些值上的插入不会触发约束。例如,insert-into-altnames-values('Al','Alan')
将成功,给我两行这些值
编辑:
我发现了一些相当奇怪的行为。根据,冲突时的默认行为是中止
,它应该生成SQLITE_约束
错误并回滚冲突数据。我发现,如果我从CSV文件导入数据,它会回滚,但不会生成错误。如果我包含一个ON CONFLICT
子句,它将执行回滚并生成一个错误但是,而不是CSV,如果我将数据导出为SQL:
INSERT INTO `altnames` (`Prime`, `Alternate`) VALUES
('Al', 'Alan'),
('Al', 'Albert'),
('Al', 'Alfred'),
('Al', 'Allan'),
......
然后以这种方式导入…然后,无论我是否在冲突中指定
,我都会得到记录的行为。使用sqlite3命令行工具打开数据库文件并执行以下操作:
CREATE TEMP TABLE import(prime, alternate);
.sep ','
.import tabledata.csv import
INSERT OR IGNORE INTO altnames SELECT * FROM import;
使用sqlite3命令行工具打开数据库文件并执行以下操作:
CREATE TEMP TABLE import(prime, alternate);
.sep ','
.import tabledata.csv import
INSERT OR IGNORE INTO altnames SELECT * FROM import;
您不需要最后一个索引;唯一约束已创建内部约束。无论如何,请给出一个例子。@CL。但是索引不会加快约束检查吗?或者,如果存在唯一
约束,它是否会自动索引?唯一约束已经创建了一个内部索引。显示一个失败数据的示例。@CL。很高兴知道。出于好奇,在同一列上指定UNIQUE
约束并同时创建UNIQUE INDEX
会创建两个索引吗?还是会得到优化?这样会创建两个索引,当表数据发生更改时,维护索引的成本会增加一倍。您不需要最后一个索引;唯一约束已创建内部约束。无论如何,请给出一个例子。@CL。但是索引不会加快约束检查吗?或者,如果存在唯一
约束,它是否会自动索引?唯一约束已经创建了一个内部索引。显示一个失败数据的示例。@CL。很高兴知道。出于好奇,在同一列上指定唯一
约束并同时创建唯一索引
会创建两个索引吗?还是会得到优化?这将创建两个索引,从而在表数据更改时使维护索引的成本加倍。