Я пытаюсь использовать функцию 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
Что не так с моим запросом? Я правда не знаю ..
Спасибо.






У вас возникнут проблемы, если вы используете явный 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 сбивает с толку.
@ passion053. . . Возможно, вы хотите увеличить значение на месте, поэтому используйте VALUES().
Возможно, вы могли бы упростить его, не используя 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». Вы вдохновили нас. Я тебе очень благодарен. Большое Вам спасибо.
Я изменил запрос, как вы предлагали, и получил еще одну ошибку. Он говорит: «Код ошибки: 1052 Столбец cpValue в списке полей неоднозначен». А что означает "ON 1 = 1" ????