Me gustaría evitar una discrepancia entre course_code
y course_name
al insertar valores en la tabla siguiente.
CREATE TABLE course (
course_id INT4 NOT NULL PRIMARY KEY,
course_code CHAR(4) NOT NULL,
course_name VARCHAR(30) NOT NULL
);
Por tanto he creado una enumeración (ver más abajo), ahora quiero enlace 'C101'
a 'Computer Science'
etc.
CREATE TYPE e_course_code AS ENUM (
'C101',
'B102',
'E103',
'V104',
'A105',
'E104'
);
CREATE TYPE e_course_name AS ENUM (
'Computer Science',
'Business Information Management',
'Electronics',
'Visual Programming',
'Audio Technology',
'Engineering'
);
¿Es posible vincular valores especificados (enumerados) para dos (o incluso más) columnas? ¿Algo que devuelve un mensaje de error al insertar un course_code
y course_name
que no coincide?
La herramienta rápida y confiable para implementar lo que pregunta en el título sería una restricción de clave externa con MATCH FULL
:
CREATE TABLE course (
course_code char(4) PRIMARY KEY
, course_name text NOT NULL
);
CREATE TABLE some_other_table (
some_other_id serial PRIMARY KEY
, course_code char(4)
, course_name text
, -- more columns
, CONSTRAINT course_fk FOREIGN KEY (course_code, course_name)
REFERENCES course(course_code, course_name) MATCH FULL
);
Relacionado:
Sin embargo, some_other_table.course_name
sería completamente redundante, y la implementación limpia sería la forma normalizada en su lugar:
CREATE TABLE some_other_table (
some_other_id serial PRIMARY KEY
, course_code char(4)
, -- more columns
, CONSTRAINT course_fk FOREIGN KEY (course_code) REFERENCES course(course_code)
);
O agrega course_id
como PK a la course
tabla y lo usa como columna FK.
Siempre puede agregar un VIEW
para mostrar course_name
adicionalmente.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras