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

时间:2009-11-18 18:03:13

标签: sql mysql indexing

使用MySQL 5

我有一张这样的表:

date (varchar)
door (varchar)
shift (varchar)
route (varchar)
trailer (varchar)
+ other fields

此表包含用户生成的内容(从另一个“主”表中复制),并防止用户创建相同数据超过1倍,该表具有基于上面指定的字段创建的唯一索引。

问题是“重复预防”索引不起作用 用户仍然可以添加重复记录而不会报告错误。

这个问题是由于我对索引的工作原理不了解吗?

或者

是否可能与主键字段冲突(自动增量int)?

CREATE TABLE如下所示:

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

3 个答案:

答案 0 :(得分:5)

  

用户仍然可以添加重复记录而不会报告错误。

“重复记录”是什么意思?

根据整理,案例,重音等可能很重要,'test''TEST'不会被视为重复。

您能否发布SHOW CREATE TABLE mytable的结果?

另外,请你运行这个查询:

SELECT  date, door, shift, route, trailer
FROM    mytable
GROUP BY
        date, door, shift, route, trailer
HAVING  COUNT(*) > 1

如果返回行,问题在于索引;如果没有,问题在于您对“重复”的定义。

<强>更新

您的列允许NULL s。

NULL索引的角度来看,MySQL中的

UNIQUE值不会被视为重复:

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;

来自documentation

  

UNIQUE索引创建一个约束,使索引中的所有值必须是不同的。如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误。除NULL存储引擎外,此约束不适用于BDB值。对于其他引擎,UNIQUE索引允许包含NULL的列的多个NULL值。如果为UNIQUE索引中的列指定前缀值,则列值在前缀中必须是唯一的。

答案 1 :(得分:3)

您确定使用的是唯一索引而不是普通索引吗?

create unique index uix on my_table (date, door, shift, route, trailer);

此类索引仅确保字段组合是唯一的,例如,如果每行的字段门不同,则可以有多个重复日期。差异可能很难发现,例如值的末尾空格或小写/大写差异。

更新:您的唯一索引似乎是有序的。问题出在其他地方。

答案 2 :(得分:0)

我认为您希望在不希望重复的字段上创建唯一约束。这将反过来创建一个独特的索引。

像这样:

ALTER TABLE YourTable 添加约束uc_yourconstraintname UNIQUE(日期,门,班次,路线,预告片)