0

我有一个非常基本的表,由一个 auto_incrementing id 列(主键)和一个包含一些不同文本的 TEXT 列组成。

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

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

4

3 回答 3

2

为您的 TEXT 列创建一个唯一索引:

错误将被忽略。

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

于 2012-04-26T16:01:24.393 回答
1

编辑:只需按照本教程,您应该设置 http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm

您已经拥有的要点,只需将 TEXT 设置为主键,您就不必担心,只要您像前面所说的那样执行 Insert Ignore。

于 2012-04-26T16:04:30.510 回答
0

我建议使用前插入触发器并使用前 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 不是唯一的,我会故意中断触发器

试试看 !!!

于 2012-04-26T17:14:31.860 回答