2011-03-06 65 views
0

查詢是:關於INSERT的幫助忽略的MySQL

$sql="CREATE TABLE IF NOT EXISTS prod_day(

id int(11) NOT NULL AUTO_INCREMENT, 
heading TEXT, 
image TEXT, 
text LONGTEXT, 
PRIMARY KEY (id) 
)TYPE=InnoDB"; 

我不想讓這相對於標題,圖片和文字列完全複製任何條目。同時,我希望id列自動遞增,請告訴我如何做到這一點。我搜索了網絡,但無法獲得任何理解我的解決方案。作爲Scrum的梅斯特指出,也許一些問題列類型:

感謝

+0

你想避免重複所有3列的組合?或每個列本身不能有重複的行? – 2011-03-06 08:07:59

+0

由於'TEXT'類型的索引具有[767個字節]的限制(http://dev.mysql.com/doc/refman/5.0/),您將很難避免重複爲'UNIQUE INDEX'。烯/列indexes.html)。 – 2011-03-06 08:09:33

+0

@The Scrum Meister,我說'完全',即只有當所有3列匹配時,一個條目纔會被認爲是重複的,以防止它再次被插入。 – 2011-03-06 08:10:42

回答

0

你可以設置所需要的列UNIQUE約束 類似:

ALTER TABLE prod_day (UNIQUE 'UKey_name' (`heading`,`image`,`text`)); 

編輯。您需要糾正此問題,或者在插入前手動執行此操作。

+0

'UNIQUE'索引在「TEXT/BLOB」列上不能工作:http://dev.mysql.com/doc/refman/5.0/en/column-indexes.html – leepowers 2011-03-06 08:42:33

1

I don't want to allow any entry that is duplicate with respect to heading , image and text column

你想要的是所有這些列的UNIQUE關鍵 - 但MySQL將只指數第767個字節的每個TEXTLONGTEXT列。 (這是字節不是字符 - 每個字符將在密鑰空間中使用多個字節)。這意味着,一個UNIQUE KEYheading兩個很長,但不同的字符串會導致重複鍵錯誤:

-- Even though the complete strings are different, MySQL isn't indexing the whole string. 
-- These two statements will result in a duplicate key error. 
INSERT INTO prod_day (heading) VALUES ('a very long string the same in the first 767 bytes ..... asdfjkl'); 
INSERT INTO prod_day (heading) VALUES ('a very long string the same in the first 767 bytes ..... 1234567'); 

您有幾種選擇:

重構您的數據庫架構使用更小的列類型:

CREATE TABLE prod_day(
id int(11) PRIMARY KEY AUTO_INCREMENT, 
heading VARCHAR(256), 
image VARCHAR(256), 
text VARCHAR(256), 
UNIQUE (heading, image, text) 
) ENGINE=InnoDB 

如果這不是那麼一個選項:

獨特的按鍵列數據的個

使用MD5哈希

CREATE TABLE prod_day(
id int(11) PRIMARY KEY AUTO_INCREMENT, 
heading TEXT, 
image TEXT, 
text LONGTEXT, 
heading_md5 VARCHAR(50), 
image_md5 VARCHAR(50), 
text_md5 VARCHAR(50), 
UNIQUE (heading_md5, image_md5, text_md5) 
) ENGINE=InnoDB 

然後,要麼有你的PHP腳本計算文本字段的MD5散列或有MySQL的做如下所示:

INSERT IGNORE INTO prod_day 
(heading, image, `text`, heading_md5, image_md5, text_md5) 
VALUES (
'HEADING Lorem ipsum dolor sit amet, ... truncated ...', 
'IMAGE Lorem ipsum dolor sit amet, ... truncated ...', 
'TEXT Lorem ipsum dolor sit amet, ... truncated ...', 
MD5('HEADING Lorem ipsum dolor sit amet, ... truncated ...'), 
MD5('IMAGE Lorem ipsum dolor sit amet, ... truncated ...'), 
MD5('TEXT Lorem ipsum dolor sit amet, ... truncated ...') 
); 
Query OK, 1 row affected (0.03 sec) 

INSERT IGNORE INTO prod_day 
(heading, image, `text`, heading_md5, image_md5, text_md5) 
VALUES (
'HEADING Lorem ipsum dolor sit amet, ... truncated ...', 
'IMAGE Lorem ipsum dolor sit amet, ... truncated ...', 
'TEXT Lorem ipsum dolor sit amet, ... truncated ...', 
MD5('HEADING Lorem ipsum dolor sit amet, ... truncated ...'), 
MD5('IMAGE Lorem ipsum dolor sit amet, ... truncated ...'), 
MD5('TEXT Lorem ipsum dolor sit amet, ... truncated ...') 
); 
Query OK, 0 rows affected (0.02 sec) -- 0 rows, duplicate avoided!