我在插入新记录时找到了一个很好的答案,如果数据已经存在则忽略。
1)在列上创建一个UNIQUE INDEX。
2)INSIGH IGNORE INTO ...
但我的问题是其中一列是VARCHAR(2000)**,MySQL对索引有1000个字符的限制。
列是:id(int),type(varchar 35),data(varchar 2000)
那么有没有办法确保我没有使用单个查询两次添加相同的数据?或者我是否需要先选择选择以检查是否存在,如果为false,则执行插入?
感谢。
**这不是设计,我只是移动数据,所以没有机会让这个列变小。
答案 0 :(得分: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会失败SELECT * FROM mydb.mytable
WHERE data_hash = UPPER(SHA('data_I_am_searching_for'));
试一试!!!