Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: tecasoft en 18 Octubre 2015, 04:12 am



Título: insertar en 1 sql solo varios datos relacionado con varias tablas
Publicado por: tecasoft en 18 Octubre 2015, 04:12 am
Buenas mi nombre es sergio, estoy viendo, como puedo insertar con una sql solo varios datos en varias tablas, este es el esquema que tengo, haber si alguien me puede guiar.

Código
  1. --
  2. -- CLIENTES
  3. --
  4. CREATE TABLE clientes(
  5. cod_cliente mediumint NOT NULL AUTO_INCREMENT,
  6. fecha VARCHAR(200),
  7. contacto VARCHAR(200),
  8. tipo VARCHAR(200),
  9. poblacion VARCHAR(200),
  10. provincia VARCHAR(200),
  11. pais VARCHAR(200),
  12. revisado VARCHAR(200),
  13. nombre_empresa VARCHAR(200),
  14. web VARCHAR(200),
  15. CONSTRAINT PKCL PRIMARY KEY (cod_cliente)
  16. ) ENGINE=InnoDB;
  17.  
  18. --
  19. -- CLIENTES_TELEFONOS
  20. --
  21. CREATE TABLE clientes_telefonos(
  22. cod_telefonos INT NOT NULL AUTO_INCREMENT,
  23. clientes_telefonos VARCHAR(200),
  24. cod_tel mediumint,
  25. CONSTRAINT PKCLTE PRIMARY KEY (cod_telefonos),
  26. CONSTRAINT FKCLTE FOREIGN KEY (cod_tel) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
  27. ) ENGINE=InnoDB;
  28.  
  29. --
  30. -- CLIENTES_TRATAMIENTO
  31. --
  32. CREATE TABLE clientes_tratamiento(
  33. cod_tratamiento INT NOT NULL AUTO_INCREMENT,
  34. nombre VARCHAR(200),
  35. apellidos VARCHAR(200),
  36. cod_tra mediumint,
  37. CONSTRAINT PKCLTR PRIMARY KEY (cod_tratamiento),
  38. CONSTRAINT FKCLTR FOREIGN KEY (cod_tra) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
  39. ) ENGINE=InnoDB;
  40.  
  41. --
  42. -- CLIENTES_EMAILS
  43. --
  44. CREATE TABLE clientes_emails(
  45. cod_emails INT NOT NULL AUTO_INCREMENT,
  46. clientes_emails VARCHAR(200),
  47. cod_email mediumint,
  48. CONSTRAINT PKCLEM PRIMARY KEY (cod_emails),
  49. CONSTRAINT FKCLEM FOREIGN KEY (cod_email) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
  50. ) ENGINE=InnoDB;
  51.  

sugerencias? o mejoras sobre las mismas? o parece estar bien organizado?, Gracias


Título: Re: insertar en 1 sql solo varios datos relacionado con varias tablas
Publicado por: Hurdano en 18 Octubre 2015, 12:11 pm
Podrías decir que sistemas estás usando? SQL Server? otro? Puede que en algunos te dejen hacerlo, pero en otros no.

Bueno, ahora mismo no recuerdo muy bien, pero puedes importar al sistema gestor un archivo.txt, en el que vienen todos los datos de las tablas, y al importarlo se introducen todos, si es eso lo que estás preguntando. Porque se pueden poner todos los insert, restricciones, etc en ese archivo y al pasarlo te lo queda.

Siento no explicarme mejor, hace tiempo ya de esto y no recuerdo muy bien, tendría que volver a repasarlo y ver como era lo que intento explicar, pero seguro que antes de que me ponga yo con ello, habrá alguien que pueda decírtelo mejor.


Título: Re: insertar en 1 sql solo varios datos relacionado con varias tablas
Publicado por: tecasoft en 18 Octubre 2015, 12:58 pm
estoy usando mysql,se podria hacer en una sql?


Título: Re: insertar en 1 sql solo varios datos relacionado con varias tablas
Publicado por: Hurdano en 18 Octubre 2015, 16:26 pm
Para una tabla se que sí, osea, hacer tu inser into values, y entre paréntesis lo que debe aparecer en cada fila en plan (valor,valor,"valor") como debas ponerlo si son integer, string, etc. Abres un conjunto de paréntesis, y ahí metes lo de una fila, cierras, abres otro y los siguientes valores y así.

Ejemplo:
Código
  1. INSERT INTO tabla (campo1, campo2, campo3) VALUES
  2. (v1_1, v1_2, v1_3),
  3. (v2_1, v2_2, v2_3),
  4. (v3_1, v3_2, v3_3);


Título: Re: insertar en 1 sql solo varios datos relacionado con varias tablas
Publicado por: 0roch1 en 22 Octubre 2015, 20:08 pm
No es posible insertar en diferentes tablas con un solo query.

Tienes dos opciones:
1. Crear un stored procedure
Working with Stored Procedures (https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html)

Código
  1. DELIMITER $$
  2.  
  3. CREATE
  4.    PROCEDURE `ehn`.`registra_cliente`(IN vnombre_empresa VARCHAR(200), IN vemail VARCHAR(200))
  5.    BEGIN
  6. INSERT INTO clientes(nombre_empresa) VALUES(vnombre_empresa);
  7. INSERT INTO clientes_emails(clientes_emails, cod_email) VALUES(vemail, LAST_INSERT_ID());
  8.    END$$
  9.  
  10. DELIMITER ;
  11.  

Código
  1. CALL registra_cliente('nombre empresa', 'email');
  2.  

2. Escribir los insert en varias consultas.

Con respecto a tu esquema te sugiero cambiar el nombre de tus campos con llave foranea, por ejemplo.

Código
  1. CREATE TABLE clientes(
  2. cod_cliente mediumint NOT NULL AUTO_INCREMENT,
  3. ...
  4. CONSTRAINT PKCL PRIMARY KEY (cod_cliente)
  5. ) ENGINE=InnoDB;
  6.  
  7.  
  8. CREATE TABLE clientes_emails(
  9. cod_emails INT NOT NULL AUTO_INCREMENT,
  10. ...
  11. cod_email mediumint,
  12. CONSTRAINT PKCLEM PRIMARY KEY (cod_emails),
  13. CONSTRAINT FKCLEM FOREIGN KEY (cod_email) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
  14. ) ENGINE=InnoDB;
  15.  

Es un poco confuso el nombre del campo cod_email en la tabla clientes_emails, mientras tu lo comprendas está bien.
Entiendo que es la relación con cod_cliente de la tabla clientes, pero para que sea más fácil de leer tienes varias opciones, incluso puedes dejarlo como: cod_cliente, cod_cliente_fk, cod_cliente_id, cliente_fk, etc.