0

我找到了一个很好的答案,当插入新记录时,如果数据已经存在,请忽略。

1)在列上创建一个唯一索引。

2)插入忽略到...

但我的问题是其中一列是 VARCHAR(2000)**,并且 MySQL 对索引有 1000 个字符的限制。

这些列是:id (int)、type (varchar 35)、data (varchar 2000)

那么有没有办法确保我不会通过单个查询两次添加相同的数据?还是我需要先进行选择以检查是否存在,如果为假,则执行插入?

谢谢。

** 这不是设计,我只是在移动数据,所以没有机会缩小此列。

4

2 回答 2

0

鉴于您提到的表格设计:

CREATE TABLE mydb.mytable
(
    id int not null auto_increment,
    type varchar(35),
    data varchar(2000),
    primary key (id)
);

您最好的机会如下:

CREATE TABLE mydb.mytable_new LIKE mydb.mytable;
ALTER TABLE mydb.mytable_new ADD COLUMN data_hash CHAR(40);
ALTER TABLE mydb.mytable_new ADD UNIQUE INDEX (data_hash);

INSERT INTO mydb.mytable_new (id,type,data,data_hash)
  SELECT id,type,data,UPPER(SHA(data)) FROM mydb.mytable;

ALTER TABLE mydb.mytable RENAME mydb.mytable_old;
ALTER TABLE mydb.mytable_new RENAME mydb.mytable;
DROP TABLE mydb.mytable_old;

添加此新列和索引后,表现在应如下所示:

CREATE TABLE mydb.mytable
(
    id int not null auto_increment,
    type varchar(35),
    data varchar(2000),
    data_hash char(40),
    primary key (id),
    unique key data_hash (data_hash)
);

只需执行以下操作:

插入

INSERT INTO mydb.mytable (type,data,data_hash)
VALUES ('somtype','newdata',UPPER(SHA('newdata')));

如果您尝试重复键插入,则 INSERT 应该在 data_hash 上失败

选择

SELECT * FROM mydb.mytable
WHERE data_hash = UPPER(SHA('data_I_am_searching_for'));

试试看 !!!

于 2013-01-25T18:31:44.050 回答
0

哈希有冲突,所以除非你不关心,否则这不是一个万无一失的解决方案

于 2021-10-20T21:36:04.277 回答