如果存在,如何更新,否则如何在MySQL中插入

如果存在,如何更新,否则如何在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

我有一个表,其自动增量字段定义为主键

我有如下专栏: 投票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 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:在查询中,
值(…)
应替换为要插入的值列表。非常感谢。我从来不知道我可以在多个列上创建唯一的索引/约束。你的解决方案奏效了。:)