我有一个非常基本的表,包含一个auto_incrementing id列(主键)和一个包含各种文本的TEXT列。
我需要在此表中插入数据,但我不想插入重复的行。我想使用INSERT IGNORE INTO
但显然IGNORE
使用表的键来确定行是否重复。由于我的表中的关键字段是自动递增,这意味着副本永远不会出现。
我的桌面设计有更好的方法吗? TEXT列是否也需要成为密钥?
答案 0 :(得分:2)
答案 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不唯一,我会导致触发器故意中断
试一试!!!