2012-04-26 46 views
0

我有一個非常基本的表,由一個auto_incrementing id列(主鍵)和一個包含一些不同文本的TEXT列組成。當鍵是auto_incremented時插入IGNORE?

我需要插入數據到這個表中,但我不想插入重複的行。我以爲使用INSERT IGNORE INTO,但顯然IGNORE使用表的關鍵來確定該行是否是重複的。由於我表中的關鍵字段是自動遞增的,這意味着重複將永遠不會出現。

對我的餐桌設計有更好的方法嗎? TEXT列是否也需要成爲關鍵字?

回答

1

編輯:只需按照本教程中,你應該設置 http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm

你已經有了,只需設置文本作爲主鍵的要點,你不會有擔心,只要你像前面說的那樣插入忽略。

+0

這是如何幫助重複插入? – 2012-04-26 16:08:01

+0

哦,我以爲你的意思是重複的鑰匙。如果你的意思是重複的文本,那麼我會說其他解決方案可能會起作用除此之外,只需在數據庫中查找要插入的文本,以防止它們重複。這通常是在製作用戶名和帳戶數據庫時完成的。 – 2012-04-26 16:47:26

+0

是的,這就是我正在做的,只是想看看有沒有辦法做到這一點沒有每個插入2查詢。謝謝 – 2012-04-26 19:52:08

0

我建議使用一個插入件前觸發和具有前255個字符

運行此示例

drop database if exists jakobud; 
create database jakobud; 
use jakobud 
create table mytext 
(
    id int not null auto_increment, 
    txt text not null, 
    txtmd5 char(32) not null default '', 
    primary key (id), 
    unique key (txtmd5) 
); 
DELIMITER $$  
CREATE TRIGGER mytext_bi 
    BEFORE INSERT ON mytext 
    FOR EACH ROW  
BEGIN 
    DECLARE found_count INT; 

    SELECT COUNT(1) INTO found_count 
    FROM mytext WHERE txtmd5 = MD5(LEFT(new.txt,10)); 
    IF found_count = 1 THEN 
     SELECT COUNT(1) INTO found_count FROM table_that_does_not_exist; 
    END IF; 
    SET new.txtmd5 = MD5(LEFT(new.txt,10)); 
END; $$  
DELIMITER ; 

的散列(MD5)然後一組數據加載到mytext的

這將忽略前255個字符的MD5的重複項。

我之所以如此,所以你並不需要在TXT場本身

有什麼好處創建索引? auto_increment不會跳過,因爲如果輸入的文本的前255個字符的MD5不是唯一的,我會導致觸發器故意中斷

試試看!

相關問題