另一种方法:创建一个DOMAIN
并将其用作 qc_isotope 的数据类型。如果数据类型出现在多个地方,这将派上用场:不必重复约束。
CREATE DOMAIN QC_ISO VARCHAR(2) CHECK (value IN ('TC', 'TL' ))
;
CREATE TABLE sensitivity
( id SERIAL NOT NULL PRIMARY KEY
);
ALTER TABLE sensitivity
ADD COLUMN qc_isotope QC_ISO NOT NULL DEFAULT 'TC'
;
INSERT INTO sensitivity(qc_isotope) VALUES ('AA') ;
INSERT INTO sensitivity(qc_isotope) VALUES ('TC') ;
SELECT * FROM sensitivity;
结果:
CREATE DOMAIN
NOTICE: CREATE TABLE will create implicit sequence "sensitivity_id_seq" for serial column "sensitivity.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "sensitivity_pkey" for table "sensitivity"
CREATE TABLE
ALTER TABLE
ERROR: value for domain qc_iso violates check constraint "qc_iso_check"
INSERT 0 1
id | qc_isotope
----+------------
2 | TC
(1 row)
更新:似乎DOMAIN
s 可以在使用后更改(这适用于 PG-9.1):
ALTER DOMAIN QC_ISO
DROP CONSTRAINT QC_ISO_check -- I don't think the name is important
;
ALTER DOMAIN QC_ISO
ADD CONSTRAINT QC_ISO_check CHECK (value IN ('TC', 'TL', 'AA' ))
;
INSERT INTO sensitivity(qc_isotope) VALUES ('AA') ;
INSERT INTO sensitivity(qc_isotope) VALUES ('BB') ;
SELECT * FROM sensitivity;
新结果:
ALTER DOMAIN
ALTER DOMAIN
ERROR: value for domain qc_iso violates check constraint "qc_iso_check"
INSERT 0 1
id | qc_isotope
----+------------
2 | TC
4 | AA
(2 rows)