我想在现有的psql表qc_isotope
中添加一列sensitivity
。 qc_isotope的值不能为NULL,并且应该等于'TC'或'TL',并为sensitivity
中的所有现有行赋予默认值'TC'。我对Postgresql很新,我不确定如何做到这一点。
这是我不成功的尝试
ALTER TABLE sensitivity
ADD COLUMN qc_isotope VARCHAR(2) CHECK 'NOT NULL' DEFAULT 'TC';
答案 0 :(得分:3)
试试这个:
ALTER TABLE sensitivity
ADD qc_isotope VARCHAR(2) DEFAULT 'TC'
CHECK (qc_isotope IN ('TC', 'TL')) NOT NULL;
here描述了检查约束的语法选项等的完整列表。还有关于alter table add column statements here的更多信息。
答案 1 :(得分:2)
另一个附件:创建一个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
一旦被使用就会被更改(这适用于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)