insertar en varias tablas fk y pk

Iniciado por bash, 1 Diciembre 2016, 03:59 AM

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

bash

un saludo a tod@s en el foro!!

soy nuevo en esto de base de datos ,y quiero entender algo, le explico tengo varias tablas , normalizadas y como es entendible hay una relaccion donde una de las columna de la tabla es una llave foranea de otra tabla ,entonces me gustaria ver un ejemplo de como puedo hacer un insert en ambas tablas ejemplo...


tabla cliente ( idcliente, nombre....)
tabla datoscliente ( idcliente fk, direccion,...)

esa seria mi tabla de prueba quisiera insertar datos en ambas tablas ,como podria hacerlo??? 
gracias por responder mis dudas

Ocelot1994

#1
Cita de: bash en  1 Diciembre 2016, 03:59 AM
un saludo a tod@s en el foro!!

soy nuevo en esto de base de datos ,y quiero entender algo, le explico tengo varias tablas , normalizadas y como es entendible hay una relaccion donde una de las columna de la tabla es una llave foranea de otra tabla ,entonces me gustaria ver un ejemplo de como puedo hacer un insert en ambas tablas ejemplo...


tabla cliente ( idcliente, nombre....)
tabla datoscliente ( idcliente fk, direccion,...)

esa seria mi tabla de prueba quisiera insertar datos en ambas tablas ,como podria hacerlo???  

Código (sql) [Seleccionar]
INSERT INTO cliente (idCliente,nombre) VALUES(1,juanito)
INSERT INTO datoscliente(idcliente, direccion) VALUES(1, calle falsa)


Esa sería una manera

bash

Gracias, ahora bien segun he visto el ID  de una tabla se puede usar como indice(claro sabiendo que algunos dbms ofrecen algo que funciona con indexer) entonces este idCliente quiero que se autoincremente, hasta ese punto todo bien , pero que tal que quiera poblar varias tablas que tiene una relacion de 1 a muchos siendo IDCliente la foreign key , que se autoincremente , no se si me explico bien , para ver si soy mas claro:

tengo una fila de cliente

IDCliente   | NombreCliente
1             |  pepito

si de una aplicacion esta quiere ingresar varias filas de la tabla de Datoscliente como lo podria hacer , sabiendo que cuando hagamos insert  en clientes el unico dato que insertaremos nosotros sera solo el nombreCliente? 

gracias de antemano.

gracias por responder mis dudas

Ocelot1994

No se si te entiendo muy bien, es decir si el id es autoincremental tu al hacer el insert solo tienes que añadir el nombredelCliente y ya.

bash

GRACIAS , Es que quizas me ahogo en un vaso de agua pero , dejame tratar de explicarme mejor.

tengo varias tablas , cliente , datosDeCliente , como dije antes DatosDeCliente tiene un FK con el PK  de cliente , entonces de una aplicacion (este punto no es importante) trato de ingresar  los datosDeCliente como podria hacer el insert si la unica relacion que tengo de Cliente y datosDeCliente es el PK que es autoincremental y no le pongo "la  mano" directamente , tengo una idea podria hacer una select top de la tabla cliente pero quisiera su opinion para ver si hay una mejor manera , que pueda ser estandar porque quiero usar el script sql en un dbms pero quiero que resulte un poco sencillo portarlo a otro.

me explique bien?
gracias por responder mis dudas

Ocelot1994

A ver que yo sepa dentro de un script sql a la hora de hacer los insert de una tabla con un valor auto incremental como clave foranea lo que podrías hacer es meter ese valor a traves de una funcion sql o mediante un trigger,ahora bien no creo que sea muy difícil pero la manera de hacerlo se me escapa, tendrías que investigar algo.

Un saludo

bash

#6
Gracias vere que resulvo y luego comento ,

ya esto lo habian dicho , la cosa es que como se autoincrementan cada vez que yo cree un cliente
el ID Aumentara entonces por default la proxima inserccion en datosCliente aumentara. creo que hay quedo. gracias a todos

edit:

Código (sql) [Seleccionar]


INSERT INTO cliente (nombre) VALUES(juanito)  --si el id value - 1
INSERT INTO datoscliente(direccion) VALUES( calle falsa) ---aqui tambien vale 1





Edit


buenas a todos de nuevo decidi seguir con mi aprendisaje pero la verdad no entiendo muy eso  de las primary key y las foreign key , he creado unas tablsas me gustaria que las vierna para recibir su consejo, se que estoy violando un par de reglas al normalizar pero creo que es por eso mismo. dejare el codigo sql (usando derby ) pero la logica es lo que me importa realmente quiero entender como podria evitar crear varios campos o como hacer los insert en la tabla de ContratoServicio  esta sirve para conectar dos tablas como son cliente , servicio y quizasd modo de pago. bueno mas abajo dejo el codigo espero y agradezco de su ayuda o consejo :D



Código (sql) [Seleccionar]

CREATE TABLE usuarios(idUsuario     varchar(32) not null CONSTRAINT UID_SC UNIQUE,
                      nombreUsuario varchar(45) not null ,
                      claveAcceso   varchar(128) not null,
                      categoria     varchar(16) not null , primary key(idUsuario)
                      activo        char not null CONSTRAINT ch_check CHECK(activo =='a' or activo == 'n'));




--Tabla Servicio
CREATE TABLE Servicio (IDServicio  integer not null GENERATED ALWAYS AS IDENTITY CONSTRAINT IDServicio_PK PRIMARY KEY,
                       ClaveBusqueda varchar(16) not null,
                       DescripcionServicio varchar(128) not null,
                       precioBase DECIMAL(9,3) not null CONSTRAINT SPRICE_C CHECK(precioBase > 20),
                       proveedorServicio varchar(32) not null);

CREATE TABLE ModoPagoDigital (IDModoPago  integer not null GENERATED ALWAYS AS IDENTITY CONSTRAINT IDServicio_PK PRIMARY KEY,
                              IDEspecifico varchar not null CONSTRAINT modo_c unique,
                              NombreDelSuplidorModoPago);



CREATE TABLE ContratoServicio (ClaveBusquedaServicio varchar(16) not null, idServicio integer not null, IDUsuario varchar(32));


INSERT INTO usuarios (idUsuario, nombreUsuario, claveAcceso, categoria, activo) values('admin'      , 'admin'     , '123456@a','admin'   , 'a');
INSERT INTO usuarios (idUsuario, nombreUsuario, claveAcceso, categoria, activo) values('empleado'   , 'empleado'  , '123456@a','empleado','a' );
INSERT INTO usuarios (idUsuario, nombreUsuario, claveAcceso, categoria, activo) values('supervisor' , 'supervisor', '123456@a','empleado','a' );
INSERT INTO usuarios (idUsuario, nombreUsuario, claveAcceso, categoria, activo) values('cliente'    , 'cliente'   , '123456@a','cliente' ,'a');
INSERT INTO usuarios (idUsuario, nombreUsuario, claveAcceso, categoria, activo) values('prueba'     , 'prueba'    , '111111'  ,'cliente' ,'n');


INSERT INTO Servicio(ClaveBusqueda, DescripcionServicio, precioBase, proveedorServicio) values('Edepagos', 'Este Servicio de electricidad', 32, 'EDESDOM');
INSERT INTO Servicio(ClaveBusqueda, DescripcionServicio, precioBase, proveedorServicio) values('FerromDiario', 'Este Servicio deja a los cliente aprender a distancia tecnicas de programacion', 32, 'FERROMDOM');
INSERT INTO Servicio(ClaveBusqueda, DescripcionServicio, precioBase, proveedorServicio) values('Aguas dominiciana', 'Este Servicio de agua', 32, 'gob. Base`');
INSERT INTO Servicio(ClaveBusqueda, DescripcionServicio, precioBase, proveedorServicio) values('net place', 'Este Servicio de Internet local', 32, 'internet');
INSERT INTO Servicio(ClaveBusqueda, DescripcionServicio, precioBase, proveedorServicio) values('telefonos Rapido', 'cuentas de telefono', 32, 'EDESDOM');



gracias por responder mis dudas

crisoof

No entiendo bien tu duda, creo que quieres saber sobre primmary y foreign key?, bueno si es asi te doy este ejemplo



el apellido paterno de tu padre, es la primmary key para el

jose Perez

tu "heredas" el apellido paterno de tu padre por ende para ti ese apellido paterno es una Foreign key, es una llave primaria de otra tabla, en este caso tu padre, ese apellido paterno también puede ser tu primmary key
tu serias
Juan Perez siendo Perez tu llave primmary y foreign key de tu padre

ahora lo que hablas de los tipo IdENTITY corresponde  un campo autoincremental, siempre va a ir aumentando, por ende no es necesario insertarlo, tal como lo tienes en tu ejemplo, tambien pudiste usar una secuenc para usar el autoincremental, espero te sirva para entender un poco mejor las primmary y foreign key
Saludos