Вставить с помощью SELECT

287

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

INSERT INTO courses (name, location, gid) 
            SELECT name, location, gid 
              FROM courses 
             WHERE cid = $cid

Можно ли только выбрать «имя, местоположение» для вставки и установить gid для чего-то еще в запросе?

рукав моря
источник

Ответы:

548

Да, конечно, но проверьте свой синтаксис.

INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM   courses
WHERE  cid = 2

Вы можете поставить константу того же типа, что и gidна ее месте, а не только 1, конечно. И я только что составил cidзначение.

Андрей
источник
2
Работал, большое спасибо. С Insert Select, круглые скобки не требуются вокруг имен полей. Но когда вы начинаете указывать значения в верхней части выбора, очевидно, вам нужно () вокруг имен полей.
Кайл
Обратите внимание , что вы не можете использовать псевдонимы в операторе вставки: «INSERT INTO курсы t1 (t1.name, t1.location, t1.gid) [...] не удастся.
Рафаил
@ Эндрю, есть ли способ вернуть этот же выбор без запуска select в следующий раз? если я хочу вставить и получить результат таблицы курсов
TAHA SULTAN TEMURI
1
@TAHASULTANTEMURI Другой вопрос. Но если я понимаю, что вы спрашиваете, SQL Server (не то, что спрашивали, а то, что я использую в наши дни) имеет OUTPUTпредложение , которое позволяет вам помещать все, что вы вставили, в другую таблицу. Я не думаю, что MySQL имеет эквивалент. Вы можете создать временную таблицу , выбрать эту таблицу, затем заполнить ее courses, а затем использовать временную таблицу для всего, что вам нужно.
Андрей
31

Да, это так. Ты можешь написать :

INSERT INTO courses (name, location, gid) 
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci

или вы можете получить значения из другого объединения выбора ...

Думитреску Богдан
источник
INSERT INTO название курса, местоположение, gid ВЫБЕРИТЕ имя, местоположение, '$ this-> gid' ИЗ курсов, ГДЕ cid = $ cid - я получаю сообщение об ошибке: у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с именем, местоположением, именем gid SELECT, местоположением, «22» ОТ курсов WHERE cid = 23 »в строке 1
Кайл
Я предполагаю, что ваше поле gid является целым числом, поэтому: «22» должно быть 22. Замените «$ this-> gid» на $ this-> gid
Alex Reche Martinez
22 и «22» не должны иметь значения для sql, но я поставил строку на случай, если поле похоже на уникальный идентификатор.
Думитреску Богдан
8

Правильный синтаксис: выбранное написание было неверным

INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci 
RolandoMySQLDBA
источник
5

Конечно, что вы хотите использовать для GID? статическое значение, PHP var, ...

Статическое значение 1234 может быть таким:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid
klennepette
источник
1

Конечно вы можете.

Однако следует отметить одну вещь: INSERT INTO SELECTоператор копирует данные из одной таблицы и вставляет их в другую таблицу И требует соответствия типов данных в исходной и целевой таблицах. Если типы данных из заданных столбцов таблицы не совпадают (т.е. пытаются вставить VARCHARв INTили TINYINTв INT), сервер MySQL выдает SQL Error (1366).

Так что будьте осторожны.

Вот синтаксис команды:

INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;

Примечание: существует способ обойти проблему вставки разных типов столбцов, используя приведение в вашем SELECT, например:

SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

Это преобразование ( CAST()является синонимом CONVERT()) очень полезно, если у ваших таблиц разные наборы символов в одном и том же столбце таблицы (что может привести к потере данных при неправильной обработке).

Бад Дамьянов
источник
-2

Правильный синтаксис для вашего запроса:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Мартин Рафаэль Перес Лара
источник