我的数据库中有一个非常简单的表结构:
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);
我没有看到为什么这不起作用的任何理由。所有变量都设置为整数。它们都是实际数字(已选中)。语法都很好看。我得到的唯一结论是它不是一个有效的查询 - 但我不确定为什么它不是一个有效的查询。
谢谢!
答案 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`
);
它不允许插入新记录,如果您尝试插入,则会显示以下错误