【问题标题】:Preventing MySQL insert if a row already contains INSERT data如果行已包含 INSERT 数据,则阻止 MySQL 插入
【发布时间】:2012-08-19 23:45:00
【问题描述】:

有点问题。首先,这是我的表结构。

表 doc_perms

id    user_id    doc_id   can_view    can_edit    can_delete

ID 是 PK,user_id 和 doc_id 是其他表的 FK。

基本上,如果 user_id 和 doc_id 的 INSERT 数据已经存在于一行中,无论其余列如何,我需要防止执行 INSERT 查询。

例如

如果你有数据

user_id  doc_id
   1        1
   1        2

然后您尝试使用 user_id = 1 和 doc_id = 2 执行 INSERT,查询失败,因为其中已经有一行包含该数据。

希望这是有道理的。

提前感谢您的帮助。

【问题讨论】:

    标签: mysql insert key duplicates


    【解决方案1】:

    假设doc_perms中没有重复,你可以create a unique index(user_id, doc_id)

    CREATE UNIQUE INDEX doc_perms_index 
      ON doc_perms (user_id,doc_id)
    

    如果有重复,你可以使用ALTER IGNORE ... ADD UNIQUE INDEX将它们删除:

    ALTER IGNORE TABLE doc_perms 
      ADD UNIQUE INDEX doc_perms_index (user_id, doc_id)
    

    (在所有共享相同(user_id,doc_id)的行中,除了一个之外的所有行都将被删除。保留的行未指定。)

    创建唯一索引后,如果 (user_id, doc_id) 重复,INSERT INTO doc_perms ... 将引发错误。

    如果您希望插入,但在(user_id, doc_id) 重复时更新其他列,那么(正如@moopet 已经提到的)您可以使用INSERT ... ON DUPLICATE KEY UPDATE。例如:

    INSERT INTO doc_perms (user_id, doc_id, foo) 
      VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE foo = 3'''
    

    【讨论】:

    • 太棒了。工作完美。谢谢。
    【解决方案2】:

    你可以使用INSERT ... ON DUPLICATE KEY UPDATE

    在此处查看 MySQL 手册:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      相关资源
      最近更新 更多