 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
waldi Ens

Registrado: 29 Dic 2004Mensajes: 25
|
Publicado: Lun 24 Oct, 2005 5:04 pm Asunto: ¿relación entre tablas si o no? |
|
|
Hola y muchas gracias de antemano.
Tengo un problema con una tabla de una base de datos desarrollada con el interbase.
Mi problema es el siguiente. en mi base de datos tengo unas cuantas tablas relacionadas entre si con lo de foreign key (clave) on update cascade on delete cascade, eso me va muy bien, pero hay a veces en el que ese campo de la T1 que se relaciona con otro de la T2 puede ser nulo. Lo he intentado solucionar quitando lo de foreign key T2(campo), pero si hago esto, no me funciona lo de delete cascade y lo de updeta cascade. No se como puedo solucionarlo
Chao y muchas gracias  |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Mar 25 Oct, 2005 3:16 pm Asunto: |
|
|
Que tal Waldi,
Si dices que el campo(llave) de la T1 puede ser nulo, entonces probablemente tengas un mal diseño en la base de datos. Recuerda que una de las principales razones de las llaves son identificar a los registros y si intentas asignar nulo pues rompes con las reglas.
Si puedes agregar parte de la estructura de las tablas y que datos son los que guardas tal vez podamos encontrar solución a tu problema.
Saludos _________________ Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida. |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Mar 25 Oct, 2005 5:53 pm Asunto: |
|
|
Buenas Buildero, perdón si no me explico bien, pero es un poco complicado.
Estas son mis dos tablas, el problema surge porque en la tabla bobina puedo tener un conductor(el campo NombreC), pero otras veces a lo mejor no lo tengo con lo cual el valor de ese campo puede ser nulo.
Lo que habia hecho era no crear una relación entre las tablas, pero me surge el problema de on delete cascade y update cascade.
Mi pregunta es si existe una manera de que esten relacionadas para que cuando borre o actualice un conductor, se modifique el campo NombreC de la tabla bobina. Pero encima quiero que en determinadas ocasiones pueda insertar elementos en la tabla bobina sin necesidad de que el campo NombreC no sea nulo. Creo que pido mucho
/*--------------Crear una tabla de nombre Conductor----------*/
create table conductor (
NombreC cnombre not null,
TipoC cnombre not null,
Pcu Decimal(15,10),
R Decimal(15,10),
primary key(NombreC)
);
/*--------------------crear una tabla de nombre bobina-------------*/
create table bobina(
NombreB cnombre not null primary key,
DEmbobinado Decimal(15,10),
NombreN cnombre not null,//dato de tabla núcleo
NombreM cnombre not null,//dato de material
NombreC cnombre //dato tabla conductor
foreign key (NombreM) references material(NombreM) on delete cascade on update cascade,
foreign key (NombreN) references nucleo(NombreN) on delete cascade on update cascade
);
Espero ser claro con la explicación y muchas gracias por las posibles soluciones,  |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Mar 25 Oct, 2005 8:02 pm Asunto: |
|
|
En efecto, desde mi muy particular punto de vista tienes mal diseñada tus tablas.
Si de antemano sabes que "NombreC" puede ser nulo entonces no puede ser tu llave primaria. Si aún tienes dudas respecto al correcto diseño de bases de datos te recomiendo una leida a la teoria.
El diseño que te propongo es el siguiente:
| Código: |
/*--------------Crear una tabla de nombre Conductor----------*/
create table conductor (
IdConductor integer not null, -->Nuevo campo de tipo entero (llave)
NombreC cnombre,
TipoC cnombre not null,
Pcu Decimal(15,10),
R Decimal(15,10),
primary key(IdConductor)
);
/*--------------------crear una tabla de nombre bobina-------------*/
create table bobina(
IdBobina integer not null, --> Nuevo campo de tipo entero (llave)
NombreB cnombre,
DEmbobinado Decimal(15,10),
IdNucleo integer not null,//dato de tabla núcleo
IdMaterial integer not null,//dato de material
IdConductor integer //dato tabla conductor
foreign key (IdMaterial) references material(IdMaterial) on delete cascade on update cascade,
foreign key (IdNucleo) references nucleo(IdNucleo) on delete cascade on update cascade
foreign key (IdConductor) references conductor(IdConductor) on delete cascade on update cascade
);
|
Observa que ahora si no especificas un nombre de conductor no importa, pero siempre existirá un valor para la clave (IdConductor). Normalmente es un autonumerico, este valor lo debes controlar, normalemnete se usan generadores para asignar este valor y para asignarlo debes hacerlo a través de un disparador. Si tienes dudas sobre esto puedes checarte la ayuda de Interbase.
Otra cosa que debes tomar en cuenta es que si creas una llave de tipo cadena, el ordenar y buscar por este tipo de llaves puede disminuir el rendimiento de tu aplicación.
Si surgen mas dudas, solo escribe.
Saludos _________________ Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida. |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Mar 25 Oct, 2005 8:31 pm Asunto: |
|
|
Hola, si es necesario por la logica del negocio que ese campo pueda ser nulo y al mismo tiempo quieres que se aplique el cascade en las actualizaciones crea una clave artificial (autonumerica) que se llamaria por ejemplo ID, puedes hacer un trigger que mediante un generator se encargue de llenar ese campo y luego defines las keys combinando ID y NombreC o lo que necesites
| Código: | CREATE TABLE "CONDUCTOR"
(
"ID" INTEGER NOT NULL,
"NOMBREC" VARCHAR(50) NOT NULL,
"TIPOC" VARCHAR(50) NOT NULL,
"PCU" DECIMAL(15, 10),
"R" DECIMAL(15, 10),
PRIMARY KEY ("ID","NOMBREC")
);
/*------------------------------------------------------------*/
CREATE TABLE BOBINA(
ID INTEGER NOT NULL,
NOMBREC VARCHAR(50) NOT NULL,
DEMBOBINADO DECIMAL(15,10),
PRIMARY KEY (ID,NOMBREC),
FOREIGN KEY (ID,NOMBREC) REFERENCES CONDUCTOR ON DELETE CASCADE ON UPDATE CASCADE
); |
Modifique algunas cosas para hacer la prueba y que sea mas entendible |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Mie 26 Oct, 2005 6:57 am Asunto: |
|
|
Muchas gracias, con gente así, si que presta. Me parece la solución adecuada.
chao y muchas gracias por vuestro tiempo  |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Jue 27 Oct, 2005 9:52 am Asunto: |
|
|
Muchas gracias, así si que presta trabajar . Intentaré pelearme con los generadores de interbase, para solucionar el problema.Gracias por las ideas.
Chao y un saludo  |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|