0

我想qc_isotope在现有的 psql 表中添加一列sensitivity。qc_isotope 的值不能为 NULL,并且应该等于 'TC' 或 'TL' ,并为 中的所有现有行提供默认值 'TC' sensitivity。我对 Postgresql 相当陌生,不确定如何做到这一点。

这是我的尝试,但没有成功

ALTER TABLE sensitivity 
ADD COLUMN qc_isotope VARCHAR(2) CHECK 'NOT NULL' DEFAULT 'TC';
4

2 回答 2

3

试试这个:

ALTER TABLE sensitivity 
   ADD qc_isotope VARCHAR(2) DEFAULT 'TC' 
       CHECK (qc_isotope IN ('TC', 'TL')) NOT NULL;

此处描述了检查约束的语法选项等的完整列表。这里还有关于 alter table add column 语句的更多信息。

于 2013-09-18T11:34:33.077 回答
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)

更新:似乎DOMAINs 可以在使用后更改(这适用于 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)
于 2013-09-18T11:55:30.320 回答