Выберите из той же таблицы в качестве вставки или обновления - PullRequest
10 голосов
/ 15 октября 2008

Очевидно, что следующее неверно.

INSERT INTO `aTable` (`A`,`B`) VALUES((SELECT MAX(`A`) FROM `aTable`)*2),'name');

Я получаю значение:

SQL-запрос:

INSERT INTO `aTable` (`A`, `B` )
VALUES 
(
  (
   SELECT MAX(`A`)
   FROM `aTable`
  ) *2
 , 'name'
)

MySQL сказал:

1093 - Вы не можете указать целевую таблицу 'aTable' для обновления в предложении FROM

Итак, я пытаюсь создать растровую таблицу, каждая строка соответствует одному биту и имеет значение «map».

Чтобы вставить в таблицу, я не хочу делать два запроса, я хочу сделать один. Как мне это сделать?

Никто не прокомментировал это, но поскольку я пытаюсь сделать растровое изображение, это должно быть * 2, а не ^ 2, моя ошибка, обратите внимание, поэтому в комментариях часто говорится ^ 2, это была ошибка в версии что читают комментаторы.

Ответы [ 5 ]

12 голосов
/ 15 октября 2008

попробовать:

insert into aTable select max(a)^2, 'name' from aTable;

или

insert into aTable select max(a)^2, 'name' from aTable group by B;

Если вам нужно объединение, вы можете сделать это:

insert into aTable select max(a)^2, 'name' from aTable, bTable;

Моя «версия сервера» - «5.0.51b-community-nt MySQL Community Edition (GPL)»

8 голосов
/ 01 ноября 2011

На самом деле, вы можете использовать псевдоним таблицы на вкладыше. Я видел этот вопрос повсюду, но никто, кажется, не пробовал это. Используйте подзапрос, чтобы получить максимум из таблицы, но псевдоним таблицы в подзапросе.

INSERT INTO tableA SET fieldA = (SELECT max(x.fieldA) FROM tableA x)+1;

Более сложный пример, когда у вас есть соответствующий вторичный ключ и, возможно, вставляется ПЕРВАЯ запись для соответствующего вторичного ключа:

INSERT INTO tableA SET secondaryKey = 123, fieldA = COALESCE((SELECT max(x.fieldA) FROM tableA x WHERE x.secondaryKey = 123)+1,1);

Используя псевдоним таблицы, она не выдает ошибку и, кажется, работает. Я просто сделал это во время кодирования чего-либо, хотя я не вижу, есть ли какие-нибудь глупые синтаксические ошибки выше, я бы попробовал этот тип синтаксиса.

5 голосов
/ 15 октября 2008

Я так понимаю, INSERT ... SELECT не работает? Я вижу это в документации к нему:

Таблица назначения ВСТАВКИ заявление может появиться в ОТ пункт ВЫБРАТЬ часть запрос. (Это было невозможно в некоторых старые версии MySQL.) В этом В этом случае MySQL создает временную таблицу держать строки из SELECT и затем вставляет эти строки в целевой стол.

Из любопытства, какую версию MySQL вы используете?

1 голос
/ 15 октября 2008

Я думаю, что вам нужно отбросить "VALUES" и иметь правильный оператор выбора.

см. Эту ссылку

Я не особо разбираюсь в MySQL, в основном использую MSSQL. Но если вы правильно отформатируете оператор выбора, он должен работать.

0 голосов
/ 15 октября 2008

, как только выбор верен, вы можете сделать это.

...