2008-10-15 2 views
9

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

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' для обновления в ЕКОМ

Итак, я пытаюсь создать таблицу растровых изображений, каждая строка соответствует одному биту и имеет «карту» va ЛУЭ.

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

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

ответ

10

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

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) "

1

Я думаю, вам нужно сбросить «ЦЕННОСТИ» и иметь действительный оператор выбора.

see this link

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

+0

Нет, я пытаюсь выбрать из той же таблицы, что и вставка, и MySQL не нравится это. Sory, я не набрал запрос правильно в первый раз, но Select все еще был прав , – 2008-10-15 15:37:52

+0

hrm. Хорошо, имеет ли mySQL пользовательские функции? Таким образом, вы можете создать функцию, которая возвращает текущий «MAX (` A`) »и использовать его в вашем заявлении? – stephenbayer 2008-10-15 15:39:55

+0

Он делает (хранимые процедуры), но я не уверен, что это позволит вам это сделать. Стоит попробовать – 2008-10-15 15:41:39

-1

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

5

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

Целевой таблица заявления INSERT может появиться в FROM пункта ЗЕЬЕСТА части запроса. (Это было невозможно в некоторых версиях MySQL ). В этом случае MySQL создает временную таблицу для хранения строк из SELECT и , а затем вставляет эти строки в целевую таблицу .

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

8

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

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); 

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

Смежные вопросы