Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] insert con value+select

Estas en el tema de insert con value+select en el foro de Mysql en Foros del Web. buenas, antes que nada disculpen si el tema ya estaba repetido pero busque y no lo encontré y aquí una explicación. tengo dos tablas: tabla1 ...
  #1 (permalink)  
Antiguo 22/04/2014, 14:23
 
Fecha de Ingreso: octubre-2012
Ubicación: El mundo
Mensajes: 49
Antigüedad: 12 años, 2 meses
Puntos: 5
insert con value+select

buenas, antes que nada disculpen si el tema ya estaba repetido pero busque y no lo encontré y aquí una explicación.
tengo dos tablas:
tabla1
id nombre apellido teléfono

tabla2
id persona otro_campo otros

persona de la tabla2 es un foreign key del id de la tabla 1.me gustaría saber si es posible que al hacer insert pudiera hacer una consulta y a la vez meter valores que no provinieran de la consulta.por ejemplo lo que quiero
Código MySQL:
Ver original
  1. insert into tabla2 values (null,"hacer un select de id de la tabla1","otro campo",null)

un saludo
  #2 (permalink)  
Antiguo 22/04/2014, 14:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: insert con value+select

Si y sólo si se cumplen al menos tres premisas:
1) No puede ser un SELECT a la misma tabla que se inserta.
2) La subconsulta debe forzosamente devolver un único dato.
3) LA tabla del INSERT no debe tener un TRIGGER que genere acciones sobre la tabla de SELECT.

De todos modos parece una mala idea. Si pudieras explicar mejor y no en abstracto lo que quires lograr, tal vez haya algo mejor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/04/2014, 15:18
 
Fecha de Ingreso: octubre-2012
Ubicación: El mundo
Mensajes: 49
Antigüedad: 12 años, 2 meses
Puntos: 5
Respuesta: insert con value+select

gracias por responder.
bueno en clases de base de datos me surgió esa duda y le pregunte al profesor y me dijo que el nunca lo había hecho así (puede ser por lo que usted dijo que parece mala idea).

bien tengo una generalizacion :personas y una persona puede ser un alumno o un profesor.
tabla personas
id nombre dni apellidos

tabla alumnos

id_persona id_alumno telefono

tabla profesores
id_persona id_profesor

la cosa es que si yo quiero insertar un nuevo profesor tengo que insertar en tabla personas ,hacer un select para ver que id tiene en personas e insertarlo en id_persona en la tabla profesores.
según entendí se puede hacer algo para obtener el ultimo id insertado o algo de eso,pero la cosa es ¿y si no fuera id sino otro campo?esto es lo que intente pero no resulto,me supongo que estara mal sintacticamente

Código MySQL:
Ver original
  1. insert into profesores values (select id_persona from personas where dni="0000000a",null)
saludos y gracias
  #4 (permalink)  
Antiguo 22/04/2014, 15:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: insert con value+select

Si te fijas el manual de referencia de MySQL, Oracle, SQL Server y dfemás, esta forma es aceptada por todos ellos:
Código SQL:
Ver original
  1. INSERT INTO tabla1(campo1, campo2, campo3, ... campo N)
  2. SELECT campo1, campo2, campo3, ...campoN
  3. FROM tabla2
  4. [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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/04/2014, 15:42
 
Fecha de Ingreso: octubre-2012
Ubicación: El mundo
Mensajes: 49
Antigüedad: 12 años, 2 meses
Puntos: 5
Respuesta: insert con value+select

ejecute esto y funciono a la perfección
Código MySQL:
Ver original
  1. insert into profesores (id_persona)
  2. select id_persona from personas where dni="a";
como el otro campo era auto incremento funciono,pero la ultima duda es, si yo tuviera otro campo en la tabla de profesores y tuviera que darle un value a ese campo que no fuera auto incremento,ni viniera de la tabla personas ¿donde se especifica el valor del campo?

gracias y un saludo
  #6 (permalink)  
Antiguo 22/04/2014, 17:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: insert con value+select

En el SELECT...

Por ejemplo, si es una constante:
Código SQL:
Ver original
  1. INSERT INTO profesores (id_persona, activo)
  2. SELECT id_persona, 1
  3. FROM personas
  4. WHERE dni="a";
O bien de una función:
Código SQL:
Ver original
  1. INSERT INTO profesores (id_persona, fecha_alta)
  2. SELECT id_persona, CURDATE()
  3. FROM personas
  4. WHERE dni="a";
O de un JOIN:
Código SQL:
Ver original
  1. INSERT INTO profesores (id_persona, id_titulo)
  2. SELECT P.id_persona, C.id_titulo
  3. FROM personas P INNER JOIN titulo_persona C ON P.id_persona = C.id_persona
  4. WHERE dni="a";

Todo depende de lo que quieras conseguir, y sólo debes cumplir lo que ya te dije:
Cita:
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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, insert, null, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:10.