Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQLite多列唯一约束允许重复_Mysql_Sqlite - Fatal编程技术网

Mysql 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

我正在将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 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。很高兴知道。出于好奇,在同一列上指定
唯一
约束并同时创建
唯一索引
会创建两个索引吗?还是会得到优化?这将创建两个索引,从而在表数据更改时使维护索引的成本加倍。