如何在 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
依次引用位置查找,但对于为了简单起见,我已经展示了如何用一个来完成它。
我正在创建一个 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
依次引用位置查找,但对于为了简单起见,我已经展示了如何用一个来完成它。