【问题标题】:MySQL insert but update/ignore duplicateMySQL插入但更新/忽略重复
【发布时间】:2012-05-27 16:23:33
【问题描述】:

这是我的表格,里面有一些示例数据

C ID | D ID    | Details |
--------------------------
 a   | b_data1 | d1      |
 a   | b_data2 | d2      |
 b   | b_data1 | d1      |
 b   | b_data2 | d2      |
 c   | b_data1 | d1      |
 c   | b_data2 | d2      |

当我运行这个查询时##

INSERT IGNORE INTO table_name (C_ID, D_ID, Details) VALUES ('C', 'b_data3','d3') ('C', 'b_data2','d2')

当它应该忽略第二个值对('C', 'b_data2','d2')时,它会插入这两行

没有定义索引/主键。

我想确保没有重复的行,这意味着三列中的数据组合起来应该使该行唯一。我不能让它独一无二。正如我在这里说明的那样,a 可以保持与 b 相同的内容,但 a 不应该有重复。

【问题讨论】:

    标签: mysql insert duplicates


    【解决方案1】:

    INSERT IGNORE 表示“忽略破坏唯一约束的行,而不是使查询失败”。您需要定义 UNIQUE 列才能使其按预期工作 - 例如CREATE TABLE tablename (col1 type, col2 type, col3 type, UNIQUE (col1, col2, col3))

    【讨论】:

    • 我不能让它独一无二,因为这是一个收藏页面,例如应该能够存储 a > b_data1 > d1 and a > b_data2 > d2 和 b b > b_data1 > d1 and b > b_data2 > d2 表关于我说明。 a 可以具有与集合 b 相同的内容,但不能在 a 中具有相同的内容
    • 如果您定义UNIQUE (col1, col2, col3),这意味着您不能在所有这些列中拥有相同的值。即,只要col2col3 不同,您就可以在col1 中具有相同的值。或者你可以在col2col3 中拥有相同的值,只要col1 不同。它是所有三列的复合索引,并不意味着它们中的每一列都必须是唯一的。
    • 非常感谢您的帮助..我现在很清楚它的用法..我无法在此表中创建唯一/主键,因为没有唯一的单列。当这三个结合在一起时,它是独一无二的。我不得不查询并执行 !in_array($data, $query_array) 来克服这个
    【解决方案2】:

    MySQL 使用 UNIQUE 索引强制执行唯一约束。如果您希望在不重新创建表的情况下添加索引,您可以:

    CREATE UNIQUE INDEX index_name ON table (C_ID, D_ID, Details)
    

    除了 INSERT IGNORE 和已经提到的 REPLACE 之外,您还可以使用 INSERT...ON DUPLICATE KEY UPDATE 来更好地控制插入运行到重复唯一时发生的情况。

    【讨论】:

    • 但我不能让它独一无二。我已经说明了那里。 a 可以保持与 b 相同的内容,但 a 不应该有重复
    • 恐怕,MySql 需要主键或唯一索引来避免重复。
    • 非常感谢您的帮助..我现在很清楚它的用法..我无法创建唯一/主键。我不得不查询并执行 !in_array($data, $query_array) 来克服这个
    【解决方案3】:

    您应该按照@lanzz 的建议定义组合的 uniqe 索引。如果要在索引冲突的情况下用新记录替换旧记录,请使用replace 语句。

    【讨论】:

    • 但我不能让它独一无二。我已经说明了那里。 a 可以保持与 b 相同的内容,但 a 不应该有重复
    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2016-10-22
    • 2020-05-19
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多