摘自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所述
答案 0 :(得分:4)
我们说前两个约束是列约束,而 第三个是表约束,因为它是分开编写的 从任何一个列定义。也可以编写列约束 作为表约束,而反过来不一定可能, 因为列约束应该仅将引用到列 它附属于。 ( 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)
NOT NULL
。我在 oracle sql + 10g 中测试了它。我使用的语法如下:
ALTER TABLE tablename MODIFY columnname NOTNULL;
期待您对此的看法。