¿Cómo restringir los valores en una columna en función de los valores de otra columna en PostgreSQL?

Excavación

Me gustaría evitar una discrepancia entre course_codey course_nameal 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_codey course_nameque no coincide?

Erwin Brandstetter

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_nameserí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_idcomo PK a la coursetabla y lo usa como columna FK.

Siempre puede agregar un VIEWpara 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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados