Ошибка 1064 при использовании SQL с INSERT INTO ... SELECT ... ON DUPLICATE KEY UPDATE

Я пытаюсь использовать функцию INSERT INTO ... SELECT ON DUPLICATE KEY UPDATE, но сейчас у меня проблемы.

Я хочу вставить данные в таблицу fruitProperty.

Мой запрос выглядит следующим образом:

START TRANSACTION;

SET @myVal1 := "";
SET @myVal2 := 0;
SET @myVal3 := 0;
SET @myVal4 := 0;
SET @myVal5 := 0;

SELECT masterIndex INTO @myVal1 FROM fruitMaster WHERE masterName = 'apple';
SELECT masterIndex INTO @myVal2 FROM fruitMaster WHERE masterName = 'banana';
SELECT masterIndex INTO @myVal3 FROM fruitMaster WHERE masterName = 'mango';
SELECT masterIndex INTO @myVal4 FROM fruitMaster WHERE masterName = 'melon';
SELECT masterIndex INTO @myVal5 FROM fruitMaster WHERE masterName = 'grape';

INSERT
INTO    fruitProperty
        (fruitID, masterIndex, cpValue)
SELECT  A1.fruitID, A2.masterIndex, A2.cpValue
FROM    (   
           SELECT   A.fruitID
           FROM     fruit A
                    JOIN fruitProperty B ON A.fruitID = B.fruitID
           WHERE    B.masterIndex = @myVal1 AND B.cpValue = 1
        ) A1
        CROSS JOIN
        (
           SELECT @myVal2 AS masterIndex, 1 AS cpValue
           UNION
           SELECT @myVal3, 1
           UNION
           SELECT @myVal4, 1
           UNION
           SELECT @myVal5, 1
       ) A2
ON DUPLICATE KEY UPDATE cpValue = cpValue + 1;

ROLLBACK;

Я встретил код ошибки.

error code: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'KEY UPDATE cpValue = 1' at line 21

Что не так с моим запросом? Я правда не знаю ..

Спасибо.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
417
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас возникнут проблемы, если вы используете явный join:

INSERT INTO fruitProperty (fruitID, masterIndex, cpValue)
SELECT f.fruitID, A2.masterIndex, A2.cpValue
FROM (SELECT f.fruitID
      FROM fruit f JOIN
           fruitProperty fp
            ON f.fruitID = fp.fruitID
      WHERE f.masterIndex = @myVal1 AND fp.cpValue = 1
     ) f JOIN
     (SELECT @myVal2 AS masterIndex, 1 AS cpValue
      UNION ALL
      SELECT @myVal3, 1
      UNION ALL
      SELECT @myVal4, 1
      UNION ALL
      SELECT @myVal5, 1
     ) A2
     ON 1=1
ON DUPLICATE KEY UPDATE cpValue = VALUES(cpValue) + 1;

Я подозреваю, что проблема связана с синтаксическим анализом, потому что MySQL / MariaDB поддерживает предложение ON для CROSS JOIN (фу !!!). Но ключевое слово ON сбивает с толку.

Я изменил запрос, как вы предлагали, и получил еще одну ошибку. Он говорит: «Код ошибки: 1052 Столбец cpValue в списке полей неоднозначен». А что означает "ON 1 = 1" ????

passion053 27.11.2018 14:01

@ passion053. . . Возможно, вы хотите увеличить значение на месте, поэтому используйте VALUES().

Gordon Linoff 27.11.2018 14:31

Возможно, вы могли бы упростить его, не используя CROSS JOIN.

В MySql CROSS JOIN, к сожалению, просто синоним INNER JOIN.

Но вы не хотите, чтобы последнее ключевое слово ON было запутано как часть JOIN.

Пример данных

create table fruitMaster (masterIndex int primary key, masterName varchar(30));

insert into fruitMaster (masterIndex, masterName) values 
(1, 'apple'),(2, 'banana'),(3, 'mango'),(4, 'melon'),(5, 'grape'), (6, 'prune');

create table fruit (fruitID int primary key, fruitName varchar(30));

insert into fruit (fruitID, fruitName) values 
(10,'jonagold'),(20,'straight banana'),(40,'big melons');

create table fruitProperty (
 fruitID int, masterIndex int, cpValue int,
 primary key (fruitID, masterIndex));

insert into fruitProperty (fruitID, masterIndex, cpValue) values
(10, 1, 1),(10, 2, 1),(10, 6, 1),
(20, 2, 1),(30, 3, 1),(40, 4, 1);

Вставить запрос

INSERT INTO fruitProperty (fruitID, masterIndex, cpValue)
SELECT F.fruitID, FM2.masterIndex, 1 AS cpValue
FROM fruit F
JOIN fruitProperty FP ON (FP.fruitID = F.fruitID AND FP.cpValue = 1)
JOIN fruitMaster FM1 ON (FM1.masterIndex = FP.masterIndex AND FM1.masterName = 'apple')
JOIN fruitMaster FM2 ON FM2.masterName IN ('banana', 'mango', 'melon', 'grape')
ON DUPLICATE KEY UPDATE cpValue = 2;

Результат:

SELECT * FROM fruitProperty;
fruitID | masterIndex | cpValue
------: | ----------: | ------:
     10 |           1 |       1
     10 |           2 |       2
     10 |           3 |       1
     10 |           4 |       1
     10 |           5 |       1
     10 |           6 |       1
     20 |           2 |       1
     30 |           3 |       1
     40 |           4 |       1

db <> рабочий пример здесь

«В MySql CROSS JOIN, к сожалению, всего лишь синоним INNER JOIN. Но вы не хотите, чтобы последнее ключевое слово ON путалось как часть JOIN». Вы вдохновили нас. Я тебе очень благодарен. Большое Вам спасибо.

passion053 28.11.2018 02:02

Другие вопросы по теме