2017-05-20 30 views
1

我想在向下表中插入值时避免course_codecourse_name之间的不匹配。如何根据PostgreSQL中另一列的值限制列中的值?

CREATE TABLE course (
    course_id INT4 NOT NULL PRIMARY KEY, 
    course_code CHAR(4) NOT NULL, 
    course_name VARCHAR(30) NOT NULL 
); 

对于这两个我创建了一个枚举(见下文),现在我要链接到'C101''Computer Science'

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' 
); 

是否有可能有两个(链接指定(枚举)值甚至更多)列?插入与course_codecourse_name不匹配的内容时会返回错误消息的内容?

回答

0

快速和可靠的工具来实现你问在标题将与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 
); 

相关:

但是,some_other_table.course_name将是完全多余的,和干净的实施将归一化的形式:

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) 
); 

或者你加course_id作为PK的course表并用其作为FK列。

您可以随时添加一个VIEW显示course_name另外。

相关问题