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?

Kyle
fuente

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.

Andrés
fuente
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 ...

Dumitrescu Bogdan
fuente
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 
RolandoMySQLDBA
fuente
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
klennepette
fuente
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).

Bud Damyanov
fuente
-2

La sintaxis correcta para su consulta es:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Martín Rafael Pérez Lara
fuente