我正在构建一个应用程序,并使用MariaDB作为我的数据库。 我有一张桌子“ kick_votes”。它的主键由三个字段组成:
我需要删除其中user_id和group_id满足我的条件的行或仅删除vote_id的行。 我启用了配置,必须使用WHERE子句中的键列来解决安全问题。
这是正常工作:
DELETE FROM kick_votes WHERE (user_id=86 AND group_id=10);
DELETE FROM kick_votes WHERE vote_id=2;
但是我不想使用两个语句,但是以下操作不起作用:
DELETE FROM kick_votes WHERE (user_id=86 AND group_id=10) OR vote_id=2;
我得到了错误:
您正在使用安全更新模式,并且尝试更新没有 使用KEY列的位置。
为什么不起作用?
答案 0 :(得分:0)
似乎存在密钥实际上并不会影响该错误。
从mariadb来源,mysql_delete
:
const_cond= (!conds || conds->const_item());
safe_update= MY_TEST(thd->variables.option_bits & OPTION_SAFE_UPDATES);
if (safe_update && const_cond)
{
my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
ER_THD(thd, ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
DBUG_RETURN(TRUE);
}
所以唯一的变种是关闭安全模式:
set @@sql_safe_updates= 0;
答案 1 :(得分:0)
尝试一下这个Kludge:
DELETE FROM kick_votes
WHERE id > 0 -- assuming this is your PRIMARY KEY
AND ( (user_id=86 AND group_id=10)
OR vote_id=2
);