我在现有表上添加约束jobs
:
DROP TABLE IF EXISTS jobs CASCADE;
DROP TYPE IF EXISTS job_state;
CREATE TYPE job_state AS ENUM ( 'UNSTARTED', 'STARTED', 'FAILED', 'COMPLETED' );
CREATE TABLE jobs(
status job_state NOT NULL DEFAULT 'UNSTARTED',
error_message text[]
);
ALTER TABLE jobs
ADD CONSTRAINT error_message_is_null_if_failed_is_false
CHECK ( status IN ('UNSTARTED', 'STARTED', 'COMPLETED') AND ( error_message IS NULL OR error_message = '{}' ));
我想要的是
INSERT INTO jobs VALUES ('UNSTARTED', null);
INSERT INTO jobs VALUES ('STARTED', null);
INSERT INTO jobs VALUES ('FAILED', null); -- I would like to be able to do this
我知道这error_message != '{}' OR error_message IS NOT NULL
写得不正确。但是我一直在寻找一种方法来编写它。
应该使用
OR
类似的方式编写约束(NOT A) OR B
你为什么这么做
并不是
failed
或者,最好不要像error_message
使用单个 ENUM那样跨多个布尔值保持状态。