Por que no me deja añadir este constraint?

Wallcroft

buenas tardes, alguien me puede decir por que no me deja añadir este constriant dada esta tabla:

donde quiero que haya un tipo y que este sea o cordinador o tesorero o null

CREATE TABLE EMPLE(
EMP_NO NUMBER(4) NOT NULL,
APELLIDO VARCHAR2(10),
OFICIO VARCHAR2(10),
DIR NUMBER(4),
FECHA_ALT DATE,
SALARIO NUMBER(10),
COMISION NUMBER(10),
DEPT_NO NUMBER(2),
CONSTRAINT PK_EMPLE PRIMARY KEY (EMP_NO)
);
ALTER TABLE EMPLE ADD TIPO VARCHAR(11);
alter table EMPLE rename to EMPLEADOS;
ALTER TABLE EMPLEADOS ADD CONSTRAINT CK_TIPO CHECK (TIPO IN ('COORDINADOR', 'TESORERO'));

ni tampoco así:

ALTER TABLE EMPLEADOS
   ADD TIPO VARCHAR(20),   
CONSTRAINT CHK_TIPO
CHECK (TIPO IN ('COORDINADOR','TESORERO'));
Oscar03

En sql el check no sirve para nada,puedes definirlo,pero no hace nada.
Puedes utilizar la siguiente sentencia para crear una view donde puedes meterle datos para que,una vez comprobada la condicion,los meta en la tabla original
create view nombre_de_la_view as select * from tabla_original where tipo in ("coordinador","tesorero") or tipo is null with cascaded check option;

Todo esto lo acabo de ver ahora en google y lo he probado con una tabla inventada,pero creo que hace lo mismo que lo que pides.
Lo he mirado porque acabo de terminar mi primero año de asir en el que doy bases de datos y el check lo vimos pero nunca lo llegamos a practicar,curioso que resulte que realmente no haga nada y haya que hacer esto

1 respuesta
Traber

#1 Cosas:

  • Indica el error que te aparece al intentar crear la tabla, código de error y mensaje.
  • No es aconsejable utilizar los campos de las tablas en mayúsculas, los nombres tampoco.
  • Lo del campo "TIPO", siendo un varchar (que se traga todo) lo ideal es que la comprobación la hagas en el programa que se encargue de insertar en la base de datos, no en el motor.
MisKo

Si vas a tener 3 valores cerrados ( coordinador, tesorero, null ), porque no utilizas un ENUM?

Si es un valor que vaya a cambiar a lo largo del tiempo o que se puedan agregar más valores, también te valdría crear una tabla adicional con los tipos válidos ( tipo: id , nombre ) y referenciar en la columna empleados a dicha tabla con la constraint, por ejemplo

1 respuesta
Wallcroft

Alfinal era el gestor de base de datos que no sé por que me daba error, cuando en otros gestores va al pelo.

Tengo que controlarlo mediante triggers ya que solo di eso y accedemos a la bbdd por el gestor de base de datos.

#4 Se puede hacer ENUM en Oracle? el tipo lo usamos como eliminación de los subtipos en el ERD al MR

#2 el check lo usamos nosotros para por ejemplo el precio de un producto tiene que ser superior a 0.

Usuarios habituales

  • Wallcroft
  • MisKo
  • Traber
  • Oscar03