如果唯一,如何进行MySQL插入,但列对于唯一索引而言太长

时间:2013-01-25 18:15:34

标签: mysql indexing

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

1)在列上创建一个UNIQUE INDEX。

2)INSIGH IGNORE INTO ...

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

列是:id(int),type(varchar 35),data(varchar 2000)

那么有没有办法确保我没有使用单个查询两次添加相同的数据?或者我是否需要先选择选择以检查是否存在,如果为false,则执行插入?

感谢。

**这不是设计,我只是移动数据,所以没有机会让这个列变小。

1 个答案:

答案 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'));

试一试!!!