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

Joh*_*n M 4 mysql sql indexing

使用MySQL 5

我有这样一张桌子:

date (varchar)
door (varchar)
shift (varchar)
route (varchar)
trailer (varchar)
+ other fields
Run Code Online (Sandbox Code Playgroud)

此表包含用户生成的内容(从另一个"主"表复制),并防止用户创建相同数据超过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"),
Run Code Online (Sandbox Code Playgroud)

重复的行是:

date       door  shift      route    trailer

10/4/2009  W17   1st Shift  TEST-01  NULL
10/4/2009  W17   1st Shift  TEST-01  NULL
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 6

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

你是什​​么意思"重复记录"?

根据整理,案例,口音等可以无所谓了,'test''TEST'不会被视为重复.

你能否发布结果SHOW CREATE TABLE mytable

还有,请你运行这个查询:

SELECT  date, door, shift, route, trailer
FROM    mytable
GROUP BY
        date, door, shift, route, trailer
HAVING  COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

如果它返回行,问题在于索引; 如果没有,问题在于您对"重复"的定义.

更新:

你的列允许NULLs.

NULLMySQLUNIQUE索引的角度来看,值不被视为重复:

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;
Run Code Online (Sandbox Code Playgroud)

来自文档:

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