【问题标题】:Need to Modify a MySQL Query to Not to Allow Duplicates Entries into a Table需要将 MySQL 查询修改为不允许重复条目进入表
【发布时间】:2012-04-19 03:37:16
【问题描述】:

首先,我对 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));

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

【问题讨论】:

    标签: mysql duplicates


    【解决方案1】:

    放置您的唯一索引以防止重复记录,并通过添加忽略关键字来执行插入查询,以免出现错误(如果您的插入重复)表明文档化,您可以这样做。

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

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

    编辑:

    在 sqlfiddle 检查示例:

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

    编辑2:

    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`)
    )
    

    【讨论】:

    • 谢谢,我尝试按照帖子中的说明添加 IGNORE,但失败了。我将如何修改以下查询代码来做到这一点?: mysql_query("INSERT INTO $TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES ".implode(',', $sql)) ;
    • 正如我所写的,始终必须保持唯一索引。如果您遇到唯一索引错误,则忽略只是忽略该错误。如果您没有唯一索引,则不会出错。我在 sqlfiddle 创建了您的 sampleo 表和示例查询。你可以在那里检查和测试。检查我在编辑后的答案中提供的链接。
    • 感谢您的示例。但这与我添加的 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));我也对值使用内爆。我如何使这行代码工作?
    • 不清楚您想说什么不起作用?我将您的表格结构和查询复制到 sql fiddle,并向您展示了一个工作示例。您的问题和解决方案已在 sqlfiddle.com 示例中准备好。如果您仍然有问题,很明显您遗漏了某些内容或没有提供足够的信息。
    • 我想我找到了问题所在。我想我需要添加另一个名为 Post_Date 的索引才能使其正常工作。
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多