mysql - 如果一行已经包含 INSERT 数据,则阻止 MySQL 插入

标签 mysql insert key duplicates

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

表 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,查询失败,因为其中已经有包含该数据的行。

希望这是有道理的。

提前感谢您的帮助。

最佳答案

假设 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'''

关于mysql - 如果一行已经包含 INSERT 数据,则阻止 MySQL 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12108920/

相关文章:

php - 在 for 循环中使用 HTTP 请求的更快方法

php - mysql:将默认值存储为变量

sql - 自动生成带有虚拟数据的sql插入语句

Mysql插入2个表

android - Google Maps APIv2 身份验证失败

windows - 如何在 Windows 操作系统中将 HID 使用 ID 转换为虚拟键码?

mysql - 选择定位效果不佳

mysql - 合并 2 个表

c - 段错误,c 中的二叉搜索树

mysql - Wordpress 如果存在 usermeta meta_key 则执行此操作