#mysql
#mysql
Вопрос:
Рассмотрим это утверждение:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE d=d 1;
Мне нужно значение d
.
Возможно ли получить его, не выполняя дальнейших SELECT
действий?
Существует уникальный индекс на a,b,c
. Будет ли этот индекс использоваться для повышения производительности? В этой таблице будет большое количество строк.
Комментарии:
1. Возможно, вы могли бы сделать это в хранимой процедуре, но нет способа извлечь это из того же оператора, о котором я знаю.
2. Если у вас составной уникальный индекс,
a b c
то ваш запрос может иногда завершаться ошибкой, когдаc=c 1
не создается уникальная комбинация.3. О, вы правы, это не C, это другое поле, D, например
Ответ №1:
Предполагая, что вы будете запускать оба запроса, используя одно и то же соединение, вы можете использовать LAST_INSERT_ID(expr)
функцию для установки текущего значения d
и проверить значение LAST_INSERT_ID()
вместе с ROW_COUNT()
функцией, чтобы узнать, была ли запись вставлена или обновлена:
INSERT INTO table (a,b,c)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE d = LAST_INSERT_ID(d 1);
SELECT IF(ROW_COUNT() = 2, LAST_INSERT_ID(), 0 /*default value*/) ;
Вы также можете использовать переменные сеанса:
INSERT INTO table (a,b,c)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE d = @tmp := (d 1);
SELECT IF(ROW_COUNT() = 2, @tmp, 0 /*default value*/) ;