03 mayo, 2020

¿Cómo hacer un INSERT con VALUE+SELECT a la misma tabla en MySQL?

Tenemos el siguiente query que funciona perfectamente en SQL Server y queremos pasarlo a MySQL.

1
2
3
4
5
6
-- En SQL Server, esto funcionaria pero en MySQL NO
INSERT INTO productos (codProd, descripcion, detalle, stock, precio, imagen)
VALUES (
 (SELECT 'P' + RIGHT('000' + CONVERT(varchar(3), MAX(CONVERT(int, RIGHT(codProd, 3))) + 1), 3) FROM productos),
 'Thor 2', 'Colección 2020', 10, 20, 'imagen.jpg'
);
Si te fijas en el manual de referencia de MySQL, Oracle y SQL Server, esta forma es aceptada por todos ellos:


Código SQL:

INSERT INTO tabla1(campo1, campo2, campo3, ... campo N)
SELECT campo1, campo2, campo3, ...campoN
FROM tabla2
[WHERE loquesea]

En tanto el número y orden de las columnas del SELECT coincida con el número y orden de los datos de la tabla del INSERT, se insertará lo devuelto por el SELECT.

Nota: Al usar VALUES, cada VALUES sólo acepta un único registro a insertar, mientras que el INSERT... SELECT inserta masivamente todo lo que el SELECT devuelva.

Si queremos hacer un INSERT con VALUE + SELECT a otra tabla o la misma tabla en MySQL debemos usar la forma mostrada INSERT + SELECT.

INSERT INTO profesores (id_persona)
SELECT id_persona FROM personas WHERE dni="a";

INSERT INTO profesores (id_persona, activo)
SELECT id_persona, 1
FROM personas 
WHERE dni="a";

1
2
3
4
5
6
7
8
-- Para MySQL debemos hacer lo siguiente, ya que no se permite hacer un SELECT a la misma tabla que se inserta
INSERT INTO productos (codProd, descripcion, detalle, stock, precio, imagen)
SELECT CONCAT('P', LPAD(MAX(RIGHT(codProd, 1)+1), 3, '0')),
       'Thor 2', 'Colección 2020',
       10,
       20,
       'imagen.jpg'
FROM productos;



No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!