Postgresql:表约束和列约束之间的差异

时间:2011-09-17 15:30:05

标签: postgresql constraints

摘自pgsql 8.4 docs:“[...]列约束只是在约束只影响一列时使用的符号方便。” 那么这个有效的sql怎么样?



DROP TABLE IF EXISTS test;
CREATE TABLE test(
id integer CONSTRAINT PK_test PRIMARY KEY  CONSTRAINT nenull NOT NULL CHECK (id3>=id2) 
--the check constraint affects two columns none of which is id
,id2 integer 
, id3 integer
);

摘录似乎仅适用于PRIMARY KEY和FOREIGN KEY约束,这些约束只会影响声明约束的同一行上的列,如Catcall所述

4 个答案:

答案 0 :(得分:4)

Elsewhere in the docs。 。

  

我们说前两个约束是列约束,而   第三个是表约束,因为它是分开编写的   从任何一个列定义。也可以编写列约束   作为表约束,而反过来不一定可能,   因为列约束应该仅将引用到列   它附属于。 ( PostgreSQL不强制执行该规则,但是你   如果您希望表定义与其他表一起使用,则应该遵循它   数据库系统。)

答案 1 :(得分:2)

1)列级约束在创建表时声明,但在创建表后创建表级约束。

2)无法在表级创建NOT NULL约束,因为All Constraint将为该特定列提供逻辑视图,但NOT NULL将分配给该结构表本身..这就是为什么我们可以在描述表时看到NOT NULL约束,不会看到其他约束。

3)复合主键必须在表级声明。

4)所有约束都可以在表级创建,但是 不允许使用表级NOT NULL

答案 2 :(得分:1)

如果外键约束或主键约束只覆盖一列,您可以选择按照自己的方式编写,或者像这样:

CREATE TABLE test(
    id integer NOT NULL CHECK (id3>=id2),
    id2 integer,
    id3 integer,
    CONSTRAINT PK_test PRIMARY KEY(id, id2, id3)
);

但是,如果PK或FK覆盖多个列,则必须使用我向您展示的“表格约束”。

它背后没有更多的魔力!

答案 3 :(得分:1)

即使在使用alter table命令创建表之后,也可以分配

NOT NULL。我在 oracle sql + 10g 中测试了它。我使用的语法如下: ALTER TABLE tablename MODIFY columnname NOTNULL;

期待您对此的看法。