MySQL-通过索引防止表中的重复记录?
使用MySQL 5 我有一张这样的桌子:MySQL-通过索引防止表中的重复记录?,sql,mysql,indexing,Sql,Mysql,Indexing,使用MySQL 5 我有一张这样的桌子: date (varchar) door (varchar) shift (varchar) route (varchar) trailer (varchar) + other fields CREATE TABLE /*!32312 IF NOT EXISTS*/ "tableA" ( "Date" varchar(12) default NULL, "door" varchar(12) default NULL, "Shift" varchar(45
date (varchar)
door (varchar)
shift (varchar)
route (varchar)
trailer (varchar)
+ other fields
CREATE TABLE /*!32312 IF NOT EXISTS*/ "tableA" (
"Date" varchar(12) default NULL,
"door" varchar(12) default NULL,
"Shift" varchar(45) default NULL,
"route" varchar(20) default NULL,
"trailer" varchar(45) default NULL,
"fieldA" varchar(45) default NULL,
"fieldB" varchar(45) default NULL,
"fieldC" varchar(45) default NULL,
"id" int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY ("id"),
UNIQUE KEY "duplicate_preventer" ("Date","door","Shift","route","trailer"),
此表包含用户生成的内容(从另一个“主”表复制而来),为了防止用户创建超过1倍的相同数据,此表具有基于上述指定字段创建的唯一索引
问题是“防止重复”索引不起作用。用户仍然可以添加重复记录,而不会报告错误 这个问题是因为我不了解索引是如何工作的吗 或 是否可能与主键字段(自动递增int)冲突 创建表如下所示:
date (varchar)
door (varchar)
shift (varchar)
route (varchar)
trailer (varchar)
+ other fields
CREATE TABLE /*!32312 IF NOT EXISTS*/ "tableA" (
"Date" varchar(12) default NULL,
"door" varchar(12) default NULL,
"Shift" varchar(45) default NULL,
"route" varchar(20) default NULL,
"trailer" varchar(45) default NULL,
"fieldA" varchar(45) default NULL,
"fieldB" varchar(45) default NULL,
"fieldC" varchar(45) default NULL,
"id" int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY ("id"),
UNIQUE KEY "duplicate_preventer" ("Date","door","Shift","route","trailer"),
重复的行是:
date door shift route trailer
10/4/2009 W17 1st Shift TEST-01 NULL
10/4/2009 W17 1st Shift TEST-01 NULL
您确定使用的是唯一索引而不是普通索引吗
create unique index uix on my_table (date, door, shift, route, trailer);
此外,这种索引只确保字段的组合是唯一的,例如,如果字段门在每一行上都不同,则可以有多个重复的日期。这种差异可能是难以发现的,例如值末尾的空格或小写/大写的差异
更新:您的唯一索引似乎是有序的。问题在别处
用户仍然可以添加重复记录,而不会报告错误
“重复记录”是什么意思
根据排序规则,大小写、重音等可能很重要,'test'
和'test'
不会被视为重复
您能否发布显示创建表格mytable
的结果
另外,请运行以下查询:
SELECT date, door, shift, route, trailer
FROM mytable
GROUP BY
date, door, shift, route, trailer
HAVING COUNT(*) > 1
如果返回行,问题在于索引;如果没有,问题在于你对“重复”的定义
更新:
您的列允许NULL
s
从UNIQUE
索引的角度来看,MySQL
中的NULL
值不被视为重复:
CREATE TABLE testtable (door VARCHAR(20), shift VARCHAR(15), UNIQUE KEY (door, shift));
INSERT
INTO testtable
VALUES
('door', NULL),
('door', NULL);
SELECT door, shift
FROM testtable
GROUP BY
door, shift
HAVING COUNT(*) > 1;
发件人:
UNIQUE
索引创建一个约束,使得索引中的所有值都必须是不同的。如果尝试添加键值与现有行匹配的新行,则会发生错误。此约束不适用于NULL
值,但BDB
存储引擎除外。对于其他引擎,UNIQUE
索引允许对可以包含NULL
的列使用多个NULL
值。如果在UNIQUE
索引中为列指定前缀值,则列值在前缀中必须是唯一的
我认为您应该在不希望复制的字段上创建一个唯一的约束。这将反过来创建一个唯一的索引 像这样: 改变你的桌子
添加约束UCY-UnclipTrimeNeXT(日期、门、移位、路由、预告器)< /P>显示CREATETABLE语句。请您张贴几行您认为是重复的行吗?您使用的是什么数据库引擎,例如,InDB或MyISAM?复制的行是:日期、门、班次、路线、拖车2009年4月10日、W17、1班次、TEST-01、NULL 2009年4月10日、W17、1班次、TEST-01、NULL相关链接:我通常通过MySQL管理员或本例中的HeidiSQL创建索引。我为索引设置了所需的列,然后选择了“唯一”选项。它确实返回了重复的行-因此问题在于索引。此外,我收到的重复记录的所有字段(在索引中)都完全相同。您能否发布
SHOW CREATE TABLE mytable
的输出?问题肯定出在索引上,它不是创建唯一的
,或者根本没有创建。我发布了创建表语法。问题在于空值