2009-11-18 119 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(日期,門,移,路線,拖車)