【问题标题】:How to restrict values in a column based on values from another column in PostgreSQL?如何根据 PostgreSQL 中另一列的值限制列中的值?
【发布时间】:2017-10-20 11:35:51
【问题描述】:

在将值插入下表时,我想防止course_codecourse_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_codecourse_name 时返回错误消息的内容?

【问题讨论】:

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


    【解决方案1】:

    在标题中实现 what you ask 的快速可靠的工具将是带有 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

    【讨论】:

      【解决方案2】:

      解决这个问题的最简单方法(如我所见)将创建两个单独的表 - 一个带有 id 和 code,另一个带有 code 和 name。请参阅此问题 - Difference between 3NF and BCNF in simple terms (must be able to explain to an 8-year old) - 答案中的示例与您的问题相似。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        相关资源
        最近更新 更多