使用约束和默认值向现有PostgreSQL表添加列

时间:2013-09-18 11:24:53

标签: sql postgresql

我想在现有的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';

2 个答案:

答案 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)