INSERTAR con SELECCIONAR


287

Tengo una consulta que se inserta usando un select:

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

¿Es posible seleccionar solo "nombre, ubicación" para la inserción y establecer gid en otra cosa en la consulta?

Respuestas:


548

Sí, absolutamente, pero verifique su sintaxis.

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

Puede poner una constante del mismo tipo que giden su lugar, no solo 1, por supuesto. Y acabo de inventar el cidvalor.


2
Trabajado, muchas gracias. Con Insertar selección, los paréntesis no son necesarios alrededor de los nombres de campo. Pero cuando comienza a especificar valores en la parte superior de la selección, aparentemente necesita () alrededor de los nombres de campo.
— Kyle

Tenga en cuenta que no puede usar alias en la cláusula de inserción: "INSERTAR EN los cursos t1 (t1.name, t1.location, t1.gid) [...] fallará.
— Rafael

@ Andrew ¿Hay algún método para devolver esta misma selección sin ejecutar select la próxima vez? si quiero insertar y obtener el resultado de la tabla de cursos
— TAHA SULTAN TEMURI

1
@TAHASULTANTEMURI Pregunta diferente. Pero si entiendo lo que está preguntando, SQL Server (no lo que se preguntó, sino lo que uso en estos días) tiene la OUTPUTcláusula , que le permite poner lo que haya insertado en otra tabla también. No creo que MySQL tenga un equivalente. Puede crear una tabla temporal , seleccionarla en esa tabla, luego completarla coursesdesde esa tabla y luego usar la tabla temporal para cualquier otra cosa que necesite.
— Andrew

31

Sí lo es. Puedes escribir :

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

o puede obtener valores de otra combinación de la selección ...


INSERTAR EN los cursos nombre, ubicación, gid SELECCIONE nombre, ubicación, '$ this-> gid' DESDE los cursos DONDE cid = $ cid - Obtengo el error: tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'nombre, ubicación, gid SELECCIONE nombre, ubicación,' 22 'DESDE los cursos DONDE cid = 23' en la línea 1
— Kyle

Supongo que su campo gid es un número entero, entonces: '22' debe ser 22. Cambie '$ this-> gid' por $ this-> gid
— Alex Reche Martinez

22 y '22' no deberían importar a sql, pero pongo una cadena en caso de que el campo sea similar a un identificador único.
— Dumitrescu Bogdan

8

Sintaxis correcta: seleccionar la ortografía fue incorrecta

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

5

Claro, ¿qué quieres usar para el gid? un valor estático, PHP var, ...

Un valor estático de 1234 podría ser como:

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


1

Por supuesto que puede.

Sin embargo, debe tenerse en cuenta una cosa: la INSERT INTO SELECTinstrucción copia datos de una tabla y los inserta en otra tabla Y requiere que los tipos de datos en las tablas de origen y destino coincidan. Si los tipos de datos de las columnas de la tabla dada no coinciden (es decir, al intentar insertar VARCHARen INT, o TINYINTen INT) el servidor MySQL arrojará un SQL Error (1366).

Así que ten cuidado.

Aquí está la sintaxis del comando:

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

Nota al margen: hay una manera de evitar el problema de inserción de diferentes tipos de columna mediante el uso de la conversión en su SELECT, por ejemplo:

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

Esta conversión ( CAST()es sinónimo de CONVERT()) es muy útil si sus tablas tienen diferentes juegos de caracteres en la misma columna de la tabla (lo que puede conducir a la pérdida de datos si no se maneja adecuadamente).


-2

La sintaxis correcta para su consulta es:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.