如何在 Postgres 中创建一个创建 table 的 IF 语句?

How do I create a IF statement creating a table in Postgres?

我正在创建一个 table,我需要一个检查约束来验证给定字符串值的可能值。我正在创建这个 table:

CREATE TABLE cat_accident (
    acc_type VARCHAR(30) NOT NULL CHECK(acc_type = 'Home accident' OR acc_type = 'Work accident'),
    acc_descrip VARCHAR(30) NOT NULL    
);

所以基本上我想验证 acc_type 是否等于 Home accident,那么 acc_descrip 可以是或 'Intoxication' OR 'burns' OR 'Kitchen wound', OR 如果 acc_type 等于工作事故,则 acc_descrip 可以是 OR 'freezing' OR 'electrocution'.

如何编写该约束条件?

CASE 表达式使用 CHECK 约束:

CREATE TABLE cat_accident (
    acc_type VARCHAR(30) NOT NULL,
    acc_descrip VARCHAR(30) NOT NULL 
    CHECK(
      CASE acc_type
        WHEN 'Home accident' THEN acc_descrip IN ('Intoxication', 'burns', 'Kitchen wound')
        WHEN 'Work accident' THEN acc_descrip IN ('freezing', 'electrocution')
      END
    )
);

参见demo

我建议通过查找来实现它 table:

CREATE TABLE l_accident_description(
    description_id    VARCHAR(5) PRIMARY KEY,
    description_full  VARCHAR(30) NOT NULL UNIQUE,
    location          VARCHAR(30)
);
INSERT INTO l_accident_description
    (description_id,description_full,location)
VALUES
    ('INTOX','Intoxication','Home Accident'),
    ('BURNS','Burns','Home Accident'),
    ('K_WND','Kitchen wound','Home Accident'),
    ('FREEZ','Freezing','Work Accident'),
    ('ELECT','Electrocution','Work Accident');

通过这种方式,您可以将要编码的关系编码到 cat_accident 中,但如果细节发生变化,这只是查找 table 中 inserting/deleting/updating 行的问题。此实现还有一个额外的好处,即您不会在 table 中重复存储那么多数据(只是 VARCHAR(5) 代码而不是 VARCHAR(30) 字符串)。然后 table 结构变为(添加了主键):

CREATE TABLE cat_accident (
    cat_accident_id PRIMARY KEY,
    acc_descrip VARCHAR(5) NOT NULL REFERENCES l_accident_description(description_id)
);

任何时候您想知道是否发生事故 Home/Work,都可以通过加入查找 table 的查询来完成。加入查找 tables 更多的是本着良好数据库构建的精神,而不是对 tables 进行硬编码检查,因为随着数据库的增长可能很容易改变或变得更复杂。

事实上,理想的解决方案可能是在此处创建 两个 查找 table,l_accident_description 依次引用位置查找,但对于为了简单起见,我已经展示了如何用一个来完成它。