我有一个非常基本的表,由一个 auto_incrementing id 列(主键)和一个包含一些不同文本的 TEXT 列组成。
我需要在这个表中插入数据,但我不想插入重复的行。我想使用INSERT IGNORE INTO
但显然IGNORE
使用表的键来确定该行是否重复。由于我表中的关键字段是自动递增的,这意味着重复项永远不会出现。
我的桌子设计有更好的方法吗?TEXT 列是否也需要成为键?
我有一个非常基本的表,由一个 auto_incrementing id 列(主键)和一个包含一些不同文本的 TEXT 列组成。
我需要在这个表中插入数据,但我不想插入重复的行。我想使用INSERT IGNORE INTO
但显然IGNORE
使用表的键来确定该行是否重复。由于我表中的关键字段是自动递增的,这意味着重复项永远不会出现。
我的桌子设计有更好的方法吗?TEXT 列是否也需要成为键?
编辑:只需按照本教程,您应该设置 http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm
您已经拥有的要点,只需将 TEXT 设置为主键,您就不必担心,只要您像前面所说的那样执行 Insert Ignore。
我建议使用前插入触发器并使用前 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 不是唯一的,我会故意中断触发器
试试看 !!!