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?

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.


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 ...


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 

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


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


-2

A sintaxe correta para sua consulta é:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.