2009-11-18 111 views
3

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

我有这样一个表:

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

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

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

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

或者

是否与主键字段(自动增量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 
+0

显示CREATE TABLE语句,请。 – dnagirl 2009-11-18 18:06:32

+0

你可以发布几行,你认为是重复的吗? – 2009-11-18 18:36:11

+0

你正在使用什么数据库引擎,例如InnoDB或MyISAM? – 2009-11-18 18:37:05

回答

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秒。在MySQL

NULL值不被视为重复从一个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索引创建一个约束,使得在所有的值指数必须明确。如果尝试使用与现有行匹配的键值添加新行,则会发生错误。此限制不适用于除BDB存储引擎之外的NULL值。对于其他引擎,UNIQUE索引允许包含NULL的列的多个NULL值。如果您为UNIQUE索引中的列指定前缀值,则列值在前缀中必须是唯一的。

+0

它确实返回重复的行 - 所以问题是索引。 – 2009-11-18 18:16:19

+0

另外 - 对我来说重复记录的所有字段(在索引中)完全相同。 – 2009-11-18 18:17:01

+0

你可以发布'SHOW CREATE TABLE mytable'的输出吗?这个问题肯定与索引有关,它不是创建'UNIQUE'或者根本就没有创建。 – Quassnoi 2009-11-18 18:19:11

3

你确定你正在使用唯一索引,而不是一个正常的指数?

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

而且那种指数只有确保该字段的组合是唯一的,比如,你可以有几个重复的日期,如果,例如,现场大门正对每一行不同。差异可能很难找到,例如值或小写/大写差异的空格。

更新:您的唯一索引似乎是有序的。问题在别处。

+0

I一般通过MySQL Administrator或在这种情况下创建我的索引HeidiSQL。我为索引设置了所需的列,然后选择“唯一”选项。 – 2009-11-18 18:07:11

0

我想你会想在你不想重复的字段上创建一个唯一的约束。这将反过来创建一个独特的索引。

像这样:

ALTER TABLE YourTable ADD CONSTRAINT uc_yourconstraintname UNIQUE(日期,门,移,路线,拖车)