Как мне обновить, если есть, иначе вставить в MySQL - PullRequest
1 голос
/ 06 марта 2020

У меня есть таблица с полем AUTO_INCREMENT, определенным как PRIMARY_KEY.

У меня есть такие столбцы: перед тем, как сделать это, я хочу проверить, есть ли строка со столбцами (voice_user_id, voice_ask_id, voice_type), совпадающая с новыми данными, которые я хочу вставить.

CONDITIONS:
IF ROW EXISTS
THEN UPDATE tableName SET vote_status=new_value, vote_time=new_time
ELSE
INSERT NEW RECORDS

Я искал inte rnet и узнал о MySQL ..ON DUPLICATE KEY UPDATE. Я понимаю, что это утверждение не будет полезным для моей задачи, поскольку оно проверяет только DUPLICATE KEY (... PRIMARY_KEY или UNIQUE FIELD). Я также узнал о MySQL REPLACE INTO ... и также это не поможет моей проблеме, поскольку она также связана с индексом PRIMARY_KEY или UNIQUE.

Я узнал, что могу использовать MERGE .... ИСПОЛЬЗУЯ ... заявления, но это приводило меня к ошибкам, поэтому я прочитал об этом больше, и я понял, что это работает только на SQL сервере (Microsoft)

Пожалуйста, как кто-нибудь может помочь мне решить эту проблему?

Я пробовал это на постах MERGE:

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}')

Ответы [ 2 ]

1 голос
/ 06 марта 2020

В MySQL используйте ON DUPLICATE KEY:

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);
0 голосов
/ 06 марта 2020

Вы хотите insert ... on duplicate key update: в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...