如果存在,如何更新,否则如何在MySQL中插入
我有一个表,其自动增量字段定义为主键 我有如下专栏: 投票id、投票用户id、投票询问id、投票评论id、投票发布id、投票类型、投票状态 我想插入新记录,但在此之前,我想检查是否有一行的列(投票\用户\ id、投票\询问\ id、投票\类型)与我想插入的新数据相同如果存在,如何更新,否则如何在MySQL中插入,mysql,sql,sql-insert,Mysql,Sql,Sql Insert,我有一个表,其自动增量字段定义为主键 我有如下专栏: 投票id、投票用户id、投票询问id、投票评论id、投票发布id、投票类型、投票状态 我想插入新记录,但在此之前,我想检查是否有一行的列(投票\用户\ id、投票\询问\ id、投票\类型)与我想插入的新数据相同 CONDITIONS: IF ROW EXISTS THEN UPDATE tableName SET vote_status=new_value, vote_time=new_time ELSE INSERT NEW RECORD
CONDITIONS:
IF ROW EXISTS
THEN UPDATE tableName SET vote_status=new_value, vote_time=new_time
ELSE
INSERT NEW RECORDS
我在互联网上搜索并了解了MySQL。关于重复密钥更新。
我意识到此语句对我的任务没有帮助,因为它只检查重复键(…主键或唯一字段)。
我还学习了MySQL替换成…同样,这对我的问题没有帮助,因为它也绑定到主键或唯一索引
我学会了使用合并…使用…语句
但这给了我错误,所以我读了更多关于它的内容,我重新体验了它只在SQL server(Microsoft)中工作
请问有人能帮我解决这个问题吗
我在MERGE staments上试过这个:
MERGE {$votes_table} WITH (HOLDLOCK) AS VT
USING ({$Qid},{$vote_type},{$CUid},{$vote_status}) AS VTS (vote_ask_id,vote_type,vote_user_id,vote_status)
ON( VT.vote_ask_id = VTS.vote_ask_id AND VT.vote_user_id=VTS.vote_user_id AND VT.vote_type=VTS.vote_type)
WHEN MATCHED THEN
UPDATE SET VT.status=VST.vote_status , VT.vote_time='{$current_time}' WHERE VT.vote_user_id=VTS.vote_user_id AND VT.vote_ask_id=VTS.vote_ask_id AND VT.vote_type=VTS.vote_type
WHEN NOT MATCHED THEN INSERT (vote_ask_id,vote_type,vote_status,vote_user_id,vote_time) VALUES('{$Qid}','{$vote_type}','{$vote_up_status}','{$CUid}','{$current_time}')
在MySQL中,对重复键使用
:
INSERT INTO tablename (vote_user_id, vote_ask_id, vote_type, . . . )
VALUES (new_vote_user_id, new_vote_ask_id, new_vote_type . . . )
ON DUPLICATE KEY UPDATE vote_status = VALUES(vote_status), vote_time = VALUES(vote_time);
为此,您需要在定义唯一行的列上设置唯一索引/约束:
CREATE UNIQUE INDEX unq_tablename_3 ON tablename(vote_user_id, vote_ask_id, vote_type);
您确实需要插入insert。。。在重复密钥更新上
:在MySQL中,这是做您想做的事情的正确方法
首先,需要在相关列的元组上创建唯一约束:
create unique index votes_table_unique_idx
on votes_table(vote_user_id, vote_ask_id, vote_type);
然后,您可以执行以下操作:
insert into votes_table(vote_user_id, vote_ask_id, vote_type, vote_comment_id, vote_post_id, vote_status)
values(...)
on duplicate key update
vote_comment_id = values(vote_comment_id),
vote_post_id = values(vote_post_id)
vote_status = values(vote_status)
在任何情况下,您是否有多行包含元组(投票\用户\ id、投票\询问\ id、投票\类型)-如果是,合并算法应该如何处理?如果没有,是什么阻止您使用唯一索引,并在重复键上进一步使用
?我在您的代码行中发现语法错误…在重复键更新集上。。。感谢您的帮助。@jamesOduro:您只需删除set
关键字,这是一个打字错误。我相应地更新了我的答案。是的。我注意到这就是为什么我不能接受你的答案。但也非常感谢,而且在ON DUPLUCATE键中的值(…)再次出现问题。。。。line@jamesOduro:在查询中,值(…)
应替换为要插入的值列表。非常感谢。我从来不知道我可以在多个列上创建唯一的索引/约束。你的解决方案奏效了。:)