2017-05-20 56 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另外。

相關問題