MySQL-通过索引防止表中的重复记录?

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

使用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) 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
的输出?问题肯定出在索引上,它不是创建
唯一的
,或者根本没有创建。我发布了创建表语法。问题在于
空值