INSERT com SELECT

287

Eu tenho uma consulta que insere usando um select:

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

É possível selecionar apenas "nome, local" para a inserção e definir gid para outra coisa na consulta?

Kyle
fonte

Respostas:

547

Sim, com certeza, mas verifique sua sintaxe.

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

Você pode colocar uma constante do mesmo tipo que gidem seu lugar, e não apenas 1, é claro. E acabei de criar o cidvalor.

Andrew
fonte
2
Trabalhou, muito obrigado. Com Inserir seleção, os parênteses não são necessários em torno dos nomes dos campos. Mas quando você começa a especificar valores no topo da seleção, aparentemente precisa () dos nomes dos campos.
Kyle
Observe que você não pode usar aliases na cláusula de inserção: "INSERT INTO cursos t1 (t1.name, t1.location, t1.gid) [...] falhará.
raphael
@ Andrew existe algum método para retornar essa mesma seleção sem executar a seleção da próxima vez? se eu quiser inserir e obter o resultado da tabela cursos
TAHA SULTAN Temuri
1
@TAHASULTANTEMURI Pergunta diferente. Mas se eu entendo o que você está perguntando, o SQL Server (não o que foi perguntado, mas o que eu uso hoje em dia) tem a OUTPUTcláusula , que permite colocar o que você inseriu em outra tabela também. Eu não acho que o MySQL tenha um equivalente. Você pode criar uma tabela temporária , selecionar nessa tabela, preencher coursesessa tabela e usar a tabela temporária para o que mais você precisar.
Andrew
31

Sim, ele é. Você pode escrever :

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

ou você pode obter valores de outra associação do select ...

Dumitrescu Bogdan
fonte
INSERT INTO nome dos cursos, localização, gid SELECT nome, localização, '$ this-> gid' FROM cursos WHERE cid = $ cid - Recebo o erro: Você tem um erro na sintaxe do SQL; verifique o manual que corresponde à versão do servidor MySQL para a sintaxe correta a ser usada perto de 'name, location, gid SELECT name, location,' 22 'FROM cursos WHERE cid = 23' na linha 1
Kyle
Eu acho que o seu campo gid é um número inteiro, então: '22' deve ser 22. Altere '$ this-> gid' por $ this-> gid
Alex Reche Martinez
22 e '22' não devem importar para o sql, mas coloquei uma string caso o campo seja semelhante a um identificador exclusivo.
Dumitrescu Bogdan 22/03
8

Sintaxe correta: a ortografia selecionada estava incorreta

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

Claro, o que você quer usar para o gid? um valor estático, PHP var, ...

Um valor estático de 1234 pode ser como:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid
klennepette
fonte
1

Claro que você pode.

No entanto, uma coisa deve ser observada: a INSERT INTO SELECTinstrução copia os dados de uma tabela e os insere em outra tabela E exige que os tipos de dados nas tabelas de origem e destino correspondam. Se os tipos de dados de dados colunas da tabela não corresponde (ou seja, tentando inserir VARCHARem INT, ou TINYINTpara INT) o servidor MySQL irá lançar umaSQL Error (1366) .

Por isso tem cuidado.

Aqui está a sintaxe do comando:

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

Nota lateral: existe uma maneira de contornar o problema de inserção de diferentes tipos de coluna usando a conversão em SELECT, por exemplo:

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

Essa conversão ( CAST()é sinônimo de CONVERT()) é muito útil se suas tabelas tiverem conjuntos de caracteres diferentes na mesma coluna da tabela (que podem potencialmente levar à perda de dados se não forem tratadas adequadamente).

Bud Damyanov
fonte
-2

A sintaxe correta para sua consulta é:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Martin Rafael Pérez Lara
fonte