INSERT如果不存在ELSE DELETE - 使用ON DUPLICATE KEY

时间:2016-08-09 04:34:59

标签: php mysql

我的数据库中有一个非常简单的表结构:

ID (Unique), userid, groupid

在userid和groupid上使用UNIQUE键 - 所以你不能有两个相同的键。例如:

ID    userid    groupid
1     86        5
2     86        6

是可能的,但是:

ID    userid    groupid
1     86        5
2     86        5

不可能。

一切正常。我想要做的是尝试插入行,如果由于重复而失败,则删除该行。我的代码很简单:

$group_query = $database->prepare("INSERT INTO users_groups (userid,groupid) VALUES (?,?) ON DUPLICATE KEY DELETE FROM users_groups WHERE userid=? AND groupid=?");
$group_query->bind_param("iiii", $user_id, $group_id, $user_id, $group_id);

我没有看到为什么这不起作用的任何理由。所有变量都设置为整数。它们都是实际数字(已选中)。语法都很好看。我得到的唯一结论是它不是一个有效的查询 - 但我不确定为什么它不是一个有效的查询。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以先使用select语句根据userid和groupid选择行:

SELECT *FROM table where userid = '86' AND groupid = '5' 

如果存在则返回行,然后检查数组是否大于0

if($result_array > 0){
 // use delete statement
}else{
 // user insert statement
}

答案 1 :(得分:0)

<强> posibility-1:

通过select语句检查相同的记录来插入新行

插入重复的行

INSERT INTO users_groups (userid,groupid)  SELECT * FROM (SELECT 5,86) AS tmp WHERE NOT EXISTS ( SELECT `groupid` FROM users_groups WHERE userid =5 and groupid=86);
  

输出:插入0行。

插入实际行

INSERT INTO users_groups (userid,groupid)  SELECT * FROM (SELECT 6,86) AS tmp WHERE NOT EXISTS ( SELECT `groupid` FROM users_groups WHERE userid =6 and groupid=86);
  

输出:插入1行。

posibility-2:

通过替换

插入新行
REPLACE INTO users_groups (`userid`,`groupid`) VALUES (?,?);
  

注意:REPLACE的工作方式与INSERT完全相同,只是如果有一个旧行   该表与PRIMARY KEY或a的新行具有相同的值   UNIQUE索引,在插入新行之前删除旧行。

<强> posibility-3:

为groupid添加唯一索引,userid

ALTER TABLE `users_groups` ADD UNIQUE (
`userid` ,
`groupid`
);

它不允许插入新记录,如果您尝试插入,则会显示以下错误

1062 - 键'groupid'重复输入'86 -5'