有关INSERT IGNORE mysql的帮助

时间:2011-03-06 08:03:04

标签: mysql

查询是:

$sql="CREATE TABLE IF NOT EXISTS prod_day(

id int(11) NOT NULL AUTO_INCREMENT,
heading TEXT,
image TEXT,
text LONGTEXT,
PRIMARY KEY (id)
)TYPE=InnoDB";

我不想允许任何与标题,图像和文本列完全重复的条目。同时我希望id列自动递增,请告诉我如何做到这一点。我用网络搜索了网,但无法让我理解任何解决方案。

感谢

2 个答案:

答案 0 :(得分:1)

  

我不想允许任何与标题,图像和文本列重复的条目

您想要的是所有这些列上的UNIQUE键 - 但MySQL只会为每个TEXTLONGTEXT列的前767个字节编制索引。 (这是字节而不是字符 - 每个字符在键空间中将使用多个字节)。这意味着在UNIQUE KEYheading会产生两个非常长但不同的字符串在重复键错误中:

-- Even though the complete strings are different, MySQL isn't indexing the whole string. 
-- These two statements will result in a duplicate key error. 
INSERT INTO prod_day (heading) VALUES ('a very long string the same in the first 767 bytes ..... asdfjkl');
INSERT INTO prod_day (heading) VALUES ('a very long string the same in the first 767 bytes ..... 1234567');

您有几个选择:

重构数据库架构以使用较小的列类型:

CREATE TABLE prod_day(
 id int(11) PRIMARY KEY AUTO_INCREMENT,
 heading VARCHAR(256),
 image VARCHAR(256),
 text VARCHAR(256),
 UNIQUE (heading, image, text)
) ENGINE=InnoDB

如果那不是一个选项,那么:

对UNIQUE键使用MD5哈希列数据

CREATE TABLE prod_day(
 id int(11) PRIMARY KEY AUTO_INCREMENT,
 heading TEXT,
 image TEXT,
 text LONGTEXT,
 heading_md5 VARCHAR(50),
 image_md5 VARCHAR(50),
 text_md5 VARCHAR(50),
 UNIQUE (heading_md5, image_md5, text_md5)
) ENGINE=InnoDB

然后,要么让PHP脚本计算文本字段的md5哈希,要么让MySQL执行以下操作:

INSERT IGNORE INTO prod_day
 (heading, image, `text`, heading_md5, image_md5, text_md5)
VALUES (
 'HEADING Lorem ipsum dolor sit amet, ... truncated ...',
 'IMAGE Lorem ipsum dolor sit amet, ... truncated ...',
 'TEXT Lorem ipsum dolor sit amet, ... truncated ...',
 MD5('HEADING Lorem ipsum dolor sit amet, ... truncated ...'),
 MD5('IMAGE Lorem ipsum dolor sit amet, ... truncated ...'),
 MD5('TEXT Lorem ipsum dolor sit amet, ... truncated ...')
);
Query OK, 1 row affected (0.03 sec)

INSERT IGNORE INTO prod_day
 (heading, image, `text`, heading_md5, image_md5, text_md5)
VALUES (
 'HEADING Lorem ipsum dolor sit amet, ... truncated ...',
 'IMAGE Lorem ipsum dolor sit amet, ... truncated ...',
 'TEXT Lorem ipsum dolor sit amet, ... truncated ...',
 MD5('HEADING Lorem ipsum dolor sit amet, ... truncated ...'),
 MD5('IMAGE Lorem ipsum dolor sit amet, ... truncated ...'),
 MD5('TEXT Lorem ipsum dolor sit amet, ... truncated ...')
);
Query OK, 0 rows affected (0.02 sec)  -- 0 rows, duplicate avoided!

答案 1 :(得分:0)

您可以在所需列上设置UNIQUE约束 类似的东西:

ALTER TABLE prod_day ( UNIQUE 'UKey_name' (`heading`,`image`,`text`));

编辑:也许Scrum Meister指出你的列类型存在一些问题。您需要纠正此问题,或在插入之前手动执行此操作。