当key为auto_increment时INSERT IGNORE?

时间:2012-04-26 15:59:26

标签: mysql

我有一个非常基本的表,包含一个auto_incrementing id列(主键)和一个包含各种文本的TEXT列。

我需要在此表中插入数据,但我不想插入重复的行。我想使用INSERT IGNORE INTO但显然IGNORE使用表的键来确定行是否重复。由于我的表中的关键字段是自动递增,这意味着副本永远不会出现。

我的桌面设计有更好的方法吗? TEXT列是否也需要成为密钥?

3 个答案:

答案 0 :(得分:2)

为TEXT列创建一个UNIQUE索引:

错误将被忽略。

请参阅http://dev.mysql.com/doc/refman/5.1/en/insert.html

答案 1 :(得分:1)

编辑:只需按照本教程进行操作即可 http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm

您已经拥有的要点,只需将TEXT设置为主键,只要您按照之前的说法进行插入忽略,就不必担心。

答案 2 :(得分:0)

我建议使用before insert trigger并使用前255个字符的哈希值(MD5)

运行此示例

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 ;   

然后将一堆数据加载到mytext

这将忽略前255个字符的MD5的重复项。

我是这样编写的,所以你不需要在txt字段本身上创建索引

有什么好处? auto_increment不会跳过,因为如果输入的文本中前255个字符的MD5不唯一,我会导致触发器故意中断

试一试!!!