insertar en 1 sql solo varios datos relacionado con varias tablas

Iniciado por tecasoft, 18 Octubre 2015, 04:12 AM

0 Miembros y 1 Visitante están viendo este tema.

tecasoft

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 (sql) [Seleccionar]

--
-- CLIENTES
--
CREATE TABLE clientes(
cod_cliente mediumint not null auto_increment,
fecha VARCHAR(200),
contacto VARCHAR(200),
tipo VARCHAR(200),
poblacion VARCHAR(200),
provincia VARCHAR(200),
pais VARCHAR(200),
revisado VARCHAR(200),
nombre_empresa VARCHAR(200),
web VARCHAR(200),
CONSTRAINT PKCL PRIMARY KEY (cod_cliente)
) ENGINE=InnoDB;

--
-- CLIENTES_TELEFONOS
--
CREATE TABLE clientes_telefonos(
cod_telefonos int not null auto_increment,
clientes_telefonos VARCHAR(200),
cod_tel mediumint,
CONSTRAINT PKCLTE PRIMARY KEY (cod_telefonos),
CONSTRAINT FKCLTE FOREIGN KEY (cod_tel) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
) ENGINE=InnoDB;

--
-- CLIENTES_TRATAMIENTO
--
CREATE TABLE clientes_tratamiento(
cod_tratamiento int not null auto_increment,
nombre VARCHAR(200),
apellidos VARCHAR(200),
cod_tra mediumint,
CONSTRAINT PKCLTR PRIMARY KEY (cod_tratamiento),
CONSTRAINT FKCLTR FOREIGN KEY (cod_tra) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
) ENGINE=InnoDB;

--
-- CLIENTES_EMAILS
--
CREATE TABLE clientes_emails(
cod_emails int not null auto_increment,
clientes_emails VARCHAR(200),
cod_email mediumint,
CONSTRAINT PKCLEM PRIMARY KEY (cod_emails),
CONSTRAINT FKCLEM FOREIGN KEY (cod_email) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
) ENGINE=InnoDB;


sugerencias? o mejoras sobre las mismas? o parece estar bien organizado?, Gracias
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

Hurdano

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.

tecasoft

http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

Hurdano

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 (sql) [Seleccionar]
INSERT INTO tabla (campo1, campo2, campo3) VALUES
(v1_1, v1_2, v1_3),
(v2_1, v2_2, v2_3),
(v3_1, v3_2, v3_3);

0roch1

No es posible insertar en diferentes tablas con un solo query.

Tienes dos opciones:
1. Crear un stored procedure
Working with Stored Procedures

Código (sql) [Seleccionar]

DELIMITER $$

CREATE
    PROCEDURE `ehn`.`registra_cliente`(IN vnombre_empresa VARCHAR(200), IN vemail VARCHAR(200))
    BEGIN
INSERT INTO clientes(nombre_empresa) VALUES(vnombre_empresa);
INSERT INTO clientes_emails(clientes_emails, cod_email) VALUES(vemail, LAST_INSERT_ID());
    END$$

DELIMITER ;


Código (sql) [Seleccionar]

CALL registra_cliente('nombre empresa', 'email');


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 (sql) [Seleccionar]

CREATE TABLE clientes(
cod_cliente mediumint NOT NULL AUTO_INCREMENT,
...
CONSTRAINT PKCL PRIMARY KEY (cod_cliente)
) ENGINE=InnoDB;


CREATE TABLE clientes_emails(
cod_emails INT NOT NULL AUTO_INCREMENT,
...
cod_email mediumint,
CONSTRAINT PKCLEM PRIMARY KEY (cod_emails),
CONSTRAINT FKCLEM FOREIGN KEY (cod_email) REFERENCES clientes(cod_cliente) ON DELETE CASCADE
) ENGINE=InnoDB;


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.