MrSunny
@MrSunny

Insert into ... select + row alias?

Приветствую.

Не получается использовать row_alias на вставке с выборкой из другой таблицы.

Структура:
CREATE TABLE IF NOT EXISTS `a` (
  `f` int DEFAULT NULL,
  `c` datetime DEFAULT NULL,
  `u` datetime DEFAULT NULL,
  UNIQUE KEY `uniqF` (`f`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Запрос:
INSERT INTO `a` (`f`,`c`) AS `row_alias`
SELECT 1, NOW()
ON DUPLICATE KEY UPDATE `u` = `row_alias`.`c`;


Фиддл (не запустится, т.к. старая версия MySQL):
https://www.db-fiddle.com/f/sYYH4VQ6EcaAs8dGSQTCSf/2

Доки (искать по "row_alias" и "row alias"):
https://dev.mysql.com/doc/refman/8.0/en/insert.html
https://dev.mysql.com/doc/refman/8.0/en/insert-on-...

Запрос должен работать с 8.0.19, у меня 8.0.21, выдает ошибку синтаксиса:
[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `ins`' at line 11


Я бы с удовольствием использовал
INSERT INTO `a` (`f`,`c`)
SELECT 1, NOW()
ON DUPLICATE KEY UPDATE `u` = VALUES(`c`);
...eсли бы не:
[HY000][1287] 'VALUES function' is deprecated and will be removed in a future release. Please use an alias (INSERT INTO ... VALUES (...) AS alias) and replace VALUES(col) in the ON DUPLICATE KEY UPDATE clause with alias.col instead
...который выбрасывает эксепшен в PDO:
PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000]: General error in C:\Code\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDOStatement.php:258


ЧЯДНТ?
  • Вопрос задан
  • 190 просмотров
Пригласить эксперта
Ответы на вопрос 1
yellow79
@yellow79
Senior Software Engineer
по вашим же ссылкам есть следующее:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

Что выглядит немного иначе, чем ваш код. Нужно оборачивать значения в алиас, а у вас обёрнут список вставляемых названий полей
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы