需要修改MySQL查询以不允许重复项进入表

时间:2012-04-18 18:31:20

标签: mysql duplicates

首先,我对MySQL很新,我试着去学习它。

我有一个在页面加载时运行的脚本,它检索联合类型数据并将其添加到MySQL数据库表中。

我想要做的就是将找到的新数据添加到数据库表中,而不添加从上一页加载中找到的重复项。

我的数据库表如下:

// Creates a Database Table only if the Table does not already exist
        mysql_query("CREATE TABLE IF NOT EXISTS $TableName(
          id INT NOT NULL AUTO_INCREMENT,
          PRIMARY KEY (id),
          Field_2    varchar(255) NOT NULL default '',
          Post_Date  int(11) NOT NULL default '0',
          Field_4    varchar(10) NOT NULL default '',
          Field_5    varchar(12) NOT NULL default '',
          Field_6    longtext NOT NULL default '',
          Field_7    longtext NOT NULL default '',
          Field_8    longtext NOT NULL default '') ") or die(mysql_error()
        );

有一个索引如下所示:

Action     Keyname  Type  Unique Packed Column Cardinality Collation Null Comment
Edit Drop  PRIMARY  BTREE Yes    No     id     830         A   

Post_Date 字段始终是唯一的(UNIX格式),因此可用于确定重复项。

我目前正在使用以下代码将数据输入数据库表,然后删除重复项:

// Enter the $sql Data into the MySQL Database Table
     mysql_query("INSERT INTO $TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES ".implode(',', $sql));
// Removes Duplicates from the MySQL Database Table based on the 'Post_Date' field
     mysql_query("Alter IGNORE table $TableName add unique key (Post_Date)");
// Deletes the added index key created by the Removes Duplicates function
     mysql_query("ALTER TABLE $TableName DROP INDEX Post_Date");

问题是,如果网页被多次命中并导致创建了许多索引,则DROP INDEX查询将失败。

虽然我有一个删除附加索引的解决方案,但其他用户告诉我完全避免使用此方法并尝试其他方法类似于INSERT ... ON DUPLICATE KEY UPDATE http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

但我不知道如何构建查询以使其工作。

我做了我的研究,发现以下网页说明了如何将数据输入到没有重复的表格中:http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm

网页说明了这个例子:

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas');

但我不知道如何修改我的查询代码以使其正常工作。

我尝试将IGNORE添加到查询中,但它也允许在表中重复输入:

mysql_query("INSERT IGNORE INTO $TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES ".implode(',', $sql));

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:3)

使用您的唯一索引来防止重复记录,并通过添加ignore关键字来执行插入查询以避免错误(如果您的插入是重复的)表示该文档并且您可以这样做。

  

表中存在唯一索引通常会导致错误   如果您将记录插入到复制的表中,则会发生   定义索引的列中的现有记录。

     

使用INSERT IGNORE而不是INSERT。如果记录不重复   现有记录,MySQL像往常一样插入它。如果记录是   重复,IGNORE关键字告诉MySQL静默丢弃它   没有产生错误。

编辑:

在sqlfiddle检查样本:

http://sqlfiddle.com/#!2/4ad8a/3

EDIT2:

CREATE TABLE IF NOT EXISTS TestTable(
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `Field_2` VARCHAR(255) NOT NULL DEFAULT '',
    `Post_Date` INT(11) NOT NULL DEFAULT '0',
    `Field_4` VARCHAR(10) NOT NULL DEFAULT '',
    `Field_5` VARCHAR(12) NOT NULL DEFAULT '',
    `Field_6` LONGTEXT NOT NULL,
    `Field_7` LONGTEXT NOT NULL,
    `Field_8` LONGTEXT NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `Post_Date` (`Post_Date`)
)