【问题标题】:Inserting into mySQL inserts duplicates? - on duplicate doubles entry插入 mySQL 会插入重复项? - 重复双打条目
【发布时间】:2014-08-12 05:00:50
【问题描述】:

我正在将搜索词插入数据库,当我运行它进行测试时,我看到重复插入到数据库中?知道为什么会这样吗?这是我的插入函数的示例 -

*Update - 我正在插入,它不再作为重复插入,但我试图让 on duplicate 工作 - 并且 on duplicate 每次都会将流行度更新 2?我这里有什么问题?

$entryDate = date("c");
$insertsearchquery="insert into article_searches (termSafe,entryDate) values (\"$termSafe\",\"$entryDate\") on duplicate key update popularity=popularity+1";

mysql_query($insertsearchquery);

【问题讨论】:

  • 您的表是如何定义的?任何(唯一或主)键?
  • 我的 id 字段是 Primary,BTREE 类型设置为 Unique。
  • 除非你插入一个 id,否则这对于列 termSafeentryDate 的有效性没有意义 - 你做什么在插入现有的 termSafe-Value 时期望?在插入现有的 entryDate 值时,您希望 什么
  • termSafe 将是搜索词,然后 entryDate 将是搜索的日期和时间。

标签: php mysql insert duplicates


【解决方案1】:

为避免重复,您需要一个unique 索引或约束(它们实际上是同一件事)或一个主键。假设您的意思是重复是由两个值引起的,您可以通过创建唯一索引来防止插入:

create unique index idx_table2_termSafe_entryDate on table2(termSafe, entryDate);

我会评论说,表名是您代码中的一个参数,这似乎很奇怪。通常,拥有多个具有相同结构的表是数据库设计不佳的标志。在大多数情况下,最好有一张大桌子而不是许多小桌子。

【讨论】:

    【解决方案2】:

    我知道您问了另一个问题,但由于您正在编写一个搜索系统,请考虑添加一个列来计算您插入该键的次数:

    popularity (smallint unsigned not null default 1)
    

    并添加

    on duplicate key update popularity=popularity+1
    

    在插入查询的末尾(这需要 termSafe 和 entryDate 列上的主键)

    【讨论】:

      【解决方案3】:

      除非您在要插入的表上设置了主键,否则不会有防止插入重复数据的逻辑。

      见:http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

      【讨论】:

        猜你喜欢
        • 2010-10-23
        • 1970-01-01
        • 2023-03-19
        • 2018-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        相关资源
        最近更新 更多