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)
用户仍然可以添加重复记录而不会报告错误.
你是什么意思"重复记录"?
根据整理,案例,口音等可以无所谓了,'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.
NULLMySQL从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;
Run Code Online (Sandbox Code Playgroud)
来自文档:
一个
UNIQUE索引创建的约束,使得该指数的所有值必须是不同的.如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误.此约束不适用于NULL除BDB存储引擎之外的值.对于其他引擎,UNIQUE索引允许NULL包含的列的多个值NULL.如果为UNIQUE索引中的列指定前缀值,则列值在前缀中必须是唯一的.