2015-03-13 2 views
1

По-видимому, комбинация INSERT INTO ... SELECT FROM ... CROSS JOIN ... ON DUPLICATE KEY UPDATE не работает. Например, у меня есть таблица с некоторой числовой информацией CREATE TABLE t (v INT);, и я хотел бы скопировать ее в существующую таблицу MEMORYCREATE TABLE m (id INT DEFAULT 1, v INT, KEY `id` (`id`)) ENGINE=MEMORY; с последовательными идентификаторами, начиная с 1. Вместо того, чтобы удалять все и повторно вставлять, если ключи существуют, я думал, что смогу выполните следующие действия:INSERT + SELECT FROM + JOIN + ON DUPLICATE KEY MySQL

INSERT INTO m 
SELECT (@x:[email protected]+1), v FROM t 
CROSS JOIN (SELECT @x:=1) a 
ON DUPLICATE KEY UPDATE m.v=t.v; 

Но я получаю следующее сообщение об ошибке:

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 'KEY UPDATE m.v=t.v' at line 1

Тем не менее, следующий запрос выполняется без ошибок (очевидно, без последовательных значений):

INSERT INTO m (v) SELECT v FROM t ON DUPLICATE KEY UPDATE m.v=t.v; 

Теперь я знаю AUTO_INCREMENT, но я прошу в целом. Я могу подумать о некоторых ситуациях, когда эта структура запросов будет полезна, так что что случилось? Я бегу 5.6.20.

SQL Fiddle со структурой таблицы.

ответ

-1

Об этом говорится в нескольких комментариях к документации по MySQL для INSERT ... ON DUPLICATE KEY UPDATE Syntax.

В качестве альтернативы, если вы предпочитаете сохранить то, что у вас есть, вместо перезаписи, вы можете использовать следующий синтаксис.

INSERT IGNORE INTO m (v) 
SELECT v 
FROM t; 
+0

К сожалению, я читал через комментарии в документации, и не могли найти комментарии вы цитирующие , Если я не пропущу ключевой момент, который упоминается, что подразумевает, что это не работает, нигде не рассматривается поведение JOIN. Не могли бы вы любезно направить меня на комментарии, о которых вы говорите? – concat

+0

@concat А ... Я пропустил, что ПРИСОЕДИНЯТЬ это то, что тебя доставало. Мне придется играть с SQL Fiddle, чтобы понять это ... –

1

Я не уверен, что происходит не так, но я нашел исправление:

INSERT INTO m 
SELECT * FROM (SELECT (@x:[email protected]+1) id, v FROM t 
CROSS JOIN (SELECT @x:=1) a) b 
ON DUPLICATE KEY UPDATE m.v=b.v; 
Смежные вопросы