Oracle建表时定义列如何添加命名检查约束?
嘿,我来帮你搞定Oracle里给列加命名检查约束的事儿!其实有两种常用的写法,我结合你的代码给你演示,一看就明白~
方式1:列级定义(和列属性写在一起)
如果你的检查约束只针对单个列,可以直接把命名约束跟在列的定义后面,写法非常紧凑:
CREATE TABLE USER2 ( -- 列定义时直接添加命名检查约束 OID NUMBER(19,0) NOT NULL CONSTRAINT USER_OID_POSITIVE_CK CHECK (OID > 0), CREATION_TIME TIMESTAMP (6) NOT NULL, LAST_MOD_TIME TIMESTAMP (6) NOT NULL CONSTRAINT USER_LASTMOD_AFTER_CREATE_CK CHECK (LAST_MOD_TIME >= CREATION_TIME), NAME VARCHAR2(500 CHAR) NOT NULL CONSTRAINT USER_NAME_NOT_EMPTY_CK CHECK (TRIM(NAME) IS NOT NULL), -- 其他列... -- 主键约束 CONSTRAINT USER_PK PRIMARY KEY (OID), -- 外键约束、唯一键约束列表... );
比如上面的例子:
- 给
OID加了命名约束USER_OID_POSITIVE_CK,确保ID是正数 - 给
LAST_MOD_TIME加了约束,保证修改时间不早于创建时间 - 给
NAME加了约束,确保去除空格后不是空字符串
方式2:表级定义(和其他约束集中管理)
如果约束涉及多个列,或者你习惯把所有约束统一放在表的末尾管理,就用表级定义的写法:
CREATE TABLE USER2 ( -- 列定义 OID NUMBER(19,0) NOT NULL, CREATION_TIME TIMESTAMP (6) NOT NULL, LAST_MOD_TIME TIMESTAMP (6) NOT NULL, NAME VARCHAR2(500 CHAR) NOT NULL, -- 其他列... -- 主键约束 CONSTRAINT USER_PK PRIMARY KEY (OID), -- 检查约束(表级统一定义) CONSTRAINT USER_OID_POSITIVE_CK CHECK (OID > 0), CONSTRAINT USER_LASTMOD_AFTER_CREATE_CK CHECK (LAST_MOD_TIME >= CREATION_TIME), CONSTRAINT USER_NAME_NOT_EMPTY_CK CHECK (TRIM(NAME) IS NOT NULL), -- 外键约束、唯一键约束列表... );
两种写法的效果完全一致,选哪种全看你的编码习惯~
另外提醒下:你原来代码里写的USER_OID_NOTNULL_CK其实没必要,因为已经给OID加了NOT NULL属性,Oracle会自动处理非空约束,重复定义反而多余啦!
内容的提问来源于stack exchange,提问作者Tapas Bose
相关产品推荐
相关产品推荐

