如何根据PostgreSQL中另一列的值限制列中的值?

时间:2017-05-20 11:24:06

标签: postgresql database-design enums foreign-keys constraints

我希望在将值插入下表时防止course_nameCREATE 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_code

是否可以链接两个(甚至更多)列的指定(枚举)值?插入不匹配的course_nameContent-Disposition: attachment; filename=calender.ics; 时会返回错误消息的内容?

2 个答案:

答案 0 :(得分:0)

解决这个问题的最简单方法(如我所见)将创建两个独立的表 - 一个具有id和代码,另一个具有代码和名称。看到这个问题 - Difference between 3NF and BCNF in simple terms (must be able to explain to an 8-year old) - 答案中的示例与您的问题类似。

答案 1 :(得分: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列。

您还可以随时向{em>显示 course_name添加VIEW