我希望在将值插入下表时防止course_name
和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_code
是否可以链接两个(甚至更多)列的指定(枚举)值?插入不匹配的course_name
和Content-Disposition: attachment; filename=calender.ics;
时会返回错误消息的内容?
答案 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
。