Запуск MySQL Insert при сбое обновления - PullRequest
0 голосов
/ 11 сентября 2018

Какой самый быстрый подход к обновлению строки, и если параметры не существуют, вставьте ее.

В моей таблице есть 2 столбца для идентификаторов quote_id, order_id, и эти столбцы вместе образуют уникальный столбец.Я не хочу, чтобы 2 строки содержали одинаковые quote_id и order_id, но каждая из них может иметь несколько строк.

id | quote_id | order_id
1  | q200     | o100
2  | q200     | o101
3  | q201     | o100

Ранее я бы добавил третье поле и объединил бы эти 2 поля с - чтобы я мог использовать ON DUPLICATE KEY UPDATE.Но это не очень эффективно, так как я, кажется, забываю иногда добавлять эти поля.

Моя идея состоит в том, чтобы попытаться выполнить запрос на обновление, и если он не удастся, вставьте его, так как я выполняю намного больше запросов на обновление, затем вставляю,Как бы поместить это в один запрос вместо того, чтобы сервер MySQL возвращал ошибку, а затем я снова запускаю запрос вставки.

if ( UPDATE table_name SET column1=value, column2=value2 WHERE some_column=some_value === ERROR ) THEN INSERT INTO table_name ....

Я просмотрел некоторые документы MySQLи я не смог найти пример, показывающий, как в операторе IF

обнаружена ошибка

1 Ответ

0 голосов
/ 11 сентября 2018

У вас должно быть ограничение PRIMARY или UNIQUE для столбцов, которые однозначно идентифицируют строки. Для этого нормально использовать несколько столбцов, и для него поддерживается синтаксис SQL:

CREATE TABLE MyTable (
  quote_id VARCHAR(4) NOT NULL,
  order_id VARCHAR(4) NOT NULL,
  other_data VARCHAR(4),
  ...
  PRIMARY KEY(quote_id, order_id)
);

Тогда вы можете положиться на уникальное ограничение, которое вызовет сбой INSERT, и вместо этого запустите UPDATE:

INSERT INTO MyTable (quote_id, order_id, other_data) VALUES ('q200', 'o100', 'blah blah')
ON DUPLICATE KEY UPDATE 
  other_data = VALUES(other_data);

Использование предложения VALUES () в части UPDATE означает «использовать то же значение для соответствующего столбца, которое я пытался использовать в части INSERT».

...