SQL Limitar valor foreign key dentro del dominio

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
Lluna
Forista Nuevo
Forista Nuevo
Mensajes: 15
Registrado: Lun Sep 14, 2009 7:00 am

SQL Limitar valor foreign key dentro del dominio

Mensaje por Lluna » Mar Ene 05, 2010 5:38 pm

Hola,

Estoy programando una base de datos para un "restaurante de lujo" (nada es el tema que nos dieron a elegir).

Dispongo de una tabla que guarda todos los trabajadores, con el campo dni como primary key y otra tabla llamada platos_cocinero, donde se guarda por cada plato quien lo ha cocinado. Esta esta compuesta por dos foreign key, una de ellas la id del plato referenciada por la primary key de la tabla correspondiente, y la otra es el dni del trabajador referenciada por la primary key de la tabla trabajadores que comentava al principio.

La cuestión es que en la tabla trabajadores tanto hay camareros, como cocineros, limpieza, etc.. y quisiera que la relacion entre las tablas trabajadores y platos_cocinero se diera solo en el caso de los trabajadores que trabajan en cocina, para esto tengo un campo en la tabla de trabajadores llamada departamento.

Claro hasta ahora yo tengo hecha la relacion al modo clássico:

ALTER TABLE PLATO_COCINERO ADD CONSTRAINT PLATO_COCINERO_FK2
FOREIGN KEY (DNI_COCINERO)
REFERENCES TRABAJADORES (DNI) ;

Y no se como indicarle aqui que ademas de tener que existir DNI_COCINERO en la tabla trabajadores como DNI, que se cumpla que DEPARTAMENTO = 'cocina'.

Espero haverme explicado bien.

P.D.; Conozco la sentencia CHECK, pero solo se usarla para limitar el valor de una columna o una serie de columnas de una tabla, no a una relacion o foreign key...

Grácias
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: SQL Limitar valor foreign key dentro del dominio

Mensaje por akodo » Mar Ene 05, 2010 8:04 pm

Seguramente no funcione, pero puedes probar algo como:

Código: Seleccionar todo

check dni in (select dni from trabajadores where departamento = 'cocina')
Creo que dependerá de la base de datos con la que estés trabajando.

Supongo que la opción más viable es crear una nueva tabla para cada departamento, para que así no tengas ese problema.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
Lluna
Forista Nuevo
Forista Nuevo
Mensajes: 15
Registrado: Lun Sep 14, 2009 7:00 am

Re: SQL Limitar valor foreign key dentro del dominio

Mensaje por Lluna » Mar Ene 05, 2010 10:45 pm

Grácias por la idea, ya me lo mirare este check, el problema es como implementarlo para esa foreign key pero ya veremos

No hago una tabla por departamento tendria N tablas con la misma informacion

No se me comentaron que era posible hacer esto, pero quizas se confundieron. Gracias de todos modos :)
Avatar de Usuario
shakka
Forista Mayor
Forista Mayor
Mensajes: 753
Registrado: Dom Sep 18, 2005 7:00 am
Contactar:

Re: SQL Limitar valor foreign key dentro del dominio

Mensaje por shakka » Mié Ene 06, 2010 12:49 am

Una opcion pueden ser triggers
http://rpbouman.blogspot.com/2009/12/va ... th_15.html

y tener solo una tabla 'departamento' con registros que contienen datos de c/depto. y valida en el insert el ID del dpto corresponda al de cocineros.
blog http://blog.mbrenes.com
Avatar de Usuario
Lluna
Forista Nuevo
Forista Nuevo
Mensajes: 15
Registrado: Lun Sep 14, 2009 7:00 am

Re: SQL Limitar valor foreign key dentro del dominio

Mensaje por Lluna » Vie Ene 08, 2010 6:58 pm

Ei!! Muchas grácias me ha servido de inspiración la web que me has dejado!

Lo que he pensado es hacer la foreign key como normalmente, y al hacer INSERT INTO o UPDATE un trigger que valide que el dni del "supuesto cocinero" que se esta introduciendo en la tabla, realmente salga como cocinero en la tabla de trabajadores.

Me lo mirare y si lo consigo ya os dire como quedo al final, siempre le puede servir a alguien más.

Editado -- Jue Ene 07, 2010 8:21 pm --

Bien gente, casi lo he conseguido.

He programado este trigger:

DROP TRIGGER cuiner_check;

CREATE TRIGGER cuiner_check
BEFORE
INSERT OR UPDATE OF DNI
ON TREBALLADORS
FOR EACH ROW
DECLARE
dni_cuiner VARCHAR2(10);
BEGIN
SELECT DISTINCT dni_cuiner
INTO dni_cuiner
FROM treballadors
WHERE departament = 'cuina';
IF (:new.dni <> dni_cuiner)
THEN dbms_output.put_line('Hola');
END IF;
END;

Pero al compilar me da el siguiente error:

Error(13,1): PLS-00103: Se ha encontrado el símbolo "SET"

Alguien sabe de que va?

P.D.: Lo del dbms_output.put_line('Hola') es solo para probar, luego si eso ya hare un raise error

Editado -- Vie Ene 08, 2010 5:56 pm --

He modificado algunos nombres que me di cuenta que estaban mal, el trigger finalmente quedo asi:

CREATE TRIGGER cuiner_check
BEFORE
INSERT ON PLAT_CUINER
FOR EACH ROW
BEGIN
SET dni VARCHAR2(9) := (SELECT DISTINCT dni
FROM TREBALLADORS
WHERE departament = 'cuina');
IF (:new.dni_cuiner NOT IN dni)
THEN dbms_output.put_line('Hola');
END IF;
END;

Los CREATE TABLE y ALTER TABLE son:

CREATE TABLE TREBALLADORS (
DNI VARCHAR2 (9),
NOM VARCHAR2 (15) NOT NULL,
COGNOM VARCHAR2 (15) NOT NULL,
ADREÇA VARCHAR2 (25),
POBLACIO VARCHAR2 (15),
CP NUMBER (5,0) CHECK (CP>0),
TELEFON NUMBER (9,0) CHECK (TELEFON > 0),
DATA_INGRES DATE,
DEPARTAMENT VARCHAR2 (10),
ESTUDIS VARCHAR2 (200),
SOU NUMBER CHECK (SOU > 0),
CONSTRAINT TREBALLADORS_PK
PRIMARY KEY ( DNI ) ) ;


CREATE TABLE PLAT_CUINER (
DNI_CUINER VARCHAR2 (9),
ID_PLAT VARCHAR2 (10),
CONSTRAINT PLAT_CUINER_PK
PRIMARY KEY ( DNI_CUINER,ID_PLAT ) ) ;

-- Referència PLAT_CUINER --> TREBALLADORS
ALTER TABLE PLAT_CUINER ADD CONSTRAINT PLAT_CUINER_FK2
FOREIGN KEY (DNI_CUINER)
REFERENCES TREBALLADORS (DNI) ;

Y por si no queda claro lo que intento hacer es comprobar con el trigger que los nuevos dni's entrados en la tabla 'plat_cuiner', ademas de existir en 'treballadors' que ja lo hacer el alter table, comprobar que tiene associado como departamento el valor 'cuina'

Y bueno, como error me sigue dando el mismo
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje