使用检查约束创建 Table
Create Table with check constraints
有人可以解释一下两个 CREATE table 语句的结果有何不同(有什么好处)?
选项 #1
CREATE TABLE sch.address_type (
address_type_cd VARCHAR2(50 BYTE) NOT NULL CONSTRAINT sch_2002 CHECK ("address_type_cd" IS NOT NULL),
desc_txt VARCHAR2(100 BYTE) NOT NULL CONSTRAINT sch_2003 CHECK ("DESC_TXT" IS NOT NULL),
rec_creat_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL CONSTRAINT sch_2001 CHECK ("REC_CREAT_TS" IS NOT NULL),
CONSTRAINT pk_address_type PRIMARY KEY (address_type_cd)
);
选项 #2
CREATE TABLE sch.address_type (
address_type_cd VARCHAR2(50 BYTE) NOT NULL,
desc_txt VARCHAR2(100 BYTE) NOT NULL,
rec_creat_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT pk_address_type PRIMARY KEY (address_type_cd)
);
谢谢
这两个语句的功能相同,但在第一个查询中你做了不必要的努力。即 address_type_cd VARCHAR2(50 BYTE) NOT NULL
与 CONSTRAINT sch_2002 CHECK ("address_type_cd" IS NOT NULL),
相同。它们都意味着字段中应该有一个值并且不能等于 NULL
查看使用查询创建的约束:
SELECT constraint_name, constraint_type, search_condition
FROM ALL_CONSTRAINTS
WHERE table_name = 'ADDRESS_TYPE';
选项 1:
CONSTRAINT_NAME C SEARCH_CONDITION
-------------------- - ------------------------------
PK_ADDRESS_TYPE P
SYS_C0010366 C "ADDRESS_TYPE_CD" IS NOT NULL
SYS_C0010367 C "DESC_TXT" IS NOT NULL
SYS_C0010368 C "REC_CREAT_TS" IS NOT NULL
SCH_2002 C address_type_cd IS NOT NULL
SCH_2003 C "DESC_TXT" IS NOT NULL
SCH_2001 C "REC_CREAT_TS" IS NOT NULL
选项 2:
CONSTRAINT_NAME C SEARCH_CONDITION
-------------------- - ------------------------------
PK_ADDRESS_TYPE P
SYS_C0010373 C "ADDRESS_TYPE_CD" IS NOT NULL
SYS_C0010374 C "DESC_TXT" IS NOT NULL
SYS_C0010375 C "REC_CREAT_TS" IS NOT NULL
选项 3:
CREATE TABLE address_type (
address_type_cd VARCHAR2(50 BYTE) CONSTRAINT address_type__cd__pk PRIMARY KEY,
desc_txt VARCHAR2(100 BYTE) CONSTRAINT address_type__desc__nn NOT NULL,
rec_creat_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
CONSTRAINT address_type__rct__nn NOT NULL
);
有约束条件:
CONSTRAINT_NAME C SEARCH_CONDITION
------------------------- - ------------------------------
ADDRESS_TYPE__CD__PK P
ADDRESS_TYPE__DESC__NN C "DESC_TXT" IS NOT NULL
ADDRESS_TYPE__RCT__NN C "REC_CREAT_TS" IS NOT NULL
所以:
- 选项 1 创建 7 个约束,其中有 3 对重复约束(其中每对都有一个用户命名约束和一个系统命名约束)
- 选项 2 创建 4 个约束(去掉重复的用户命名约束,保留系统命名约束)
- 选项 3 仅创建 3 个约束 -
NOT NULL
约束在 PRIMARY KEY
列上是不必要的,它还命名了 NOT NULL
约束。
所有选项都会给出相同的有效结果。命名约束在调试期间很有用(甚至 NOT NULL
约束)
有人可以解释一下两个 CREATE table 语句的结果有何不同(有什么好处)?
选项 #1
CREATE TABLE sch.address_type (
address_type_cd VARCHAR2(50 BYTE) NOT NULL CONSTRAINT sch_2002 CHECK ("address_type_cd" IS NOT NULL),
desc_txt VARCHAR2(100 BYTE) NOT NULL CONSTRAINT sch_2003 CHECK ("DESC_TXT" IS NOT NULL),
rec_creat_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL CONSTRAINT sch_2001 CHECK ("REC_CREAT_TS" IS NOT NULL),
CONSTRAINT pk_address_type PRIMARY KEY (address_type_cd)
);
选项 #2
CREATE TABLE sch.address_type (
address_type_cd VARCHAR2(50 BYTE) NOT NULL,
desc_txt VARCHAR2(100 BYTE) NOT NULL,
rec_creat_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT pk_address_type PRIMARY KEY (address_type_cd)
);
谢谢
这两个语句的功能相同,但在第一个查询中你做了不必要的努力。即 address_type_cd VARCHAR2(50 BYTE) NOT NULL
与 CONSTRAINT sch_2002 CHECK ("address_type_cd" IS NOT NULL),
相同。它们都意味着字段中应该有一个值并且不能等于 NULL
查看使用查询创建的约束:
SELECT constraint_name, constraint_type, search_condition
FROM ALL_CONSTRAINTS
WHERE table_name = 'ADDRESS_TYPE';
选项 1:
CONSTRAINT_NAME C SEARCH_CONDITION
-------------------- - ------------------------------
PK_ADDRESS_TYPE P
SYS_C0010366 C "ADDRESS_TYPE_CD" IS NOT NULL
SYS_C0010367 C "DESC_TXT" IS NOT NULL
SYS_C0010368 C "REC_CREAT_TS" IS NOT NULL
SCH_2002 C address_type_cd IS NOT NULL
SCH_2003 C "DESC_TXT" IS NOT NULL
SCH_2001 C "REC_CREAT_TS" IS NOT NULL
选项 2:
CONSTRAINT_NAME C SEARCH_CONDITION
-------------------- - ------------------------------
PK_ADDRESS_TYPE P
SYS_C0010373 C "ADDRESS_TYPE_CD" IS NOT NULL
SYS_C0010374 C "DESC_TXT" IS NOT NULL
SYS_C0010375 C "REC_CREAT_TS" IS NOT NULL
选项 3:
CREATE TABLE address_type (
address_type_cd VARCHAR2(50 BYTE) CONSTRAINT address_type__cd__pk PRIMARY KEY,
desc_txt VARCHAR2(100 BYTE) CONSTRAINT address_type__desc__nn NOT NULL,
rec_creat_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
CONSTRAINT address_type__rct__nn NOT NULL
);
有约束条件:
CONSTRAINT_NAME C SEARCH_CONDITION
------------------------- - ------------------------------
ADDRESS_TYPE__CD__PK P
ADDRESS_TYPE__DESC__NN C "DESC_TXT" IS NOT NULL
ADDRESS_TYPE__RCT__NN C "REC_CREAT_TS" IS NOT NULL
所以:
- 选项 1 创建 7 个约束,其中有 3 对重复约束(其中每对都有一个用户命名约束和一个系统命名约束)
- 选项 2 创建 4 个约束(去掉重复的用户命名约束,保留系统命名约束)
- 选项 3 仅创建 3 个约束 -
NOT NULL
约束在PRIMARY KEY
列上是不必要的,它还命名了NOT NULL
约束。
所有选项都会给出相同的有效结果。命名约束在调试期间很有用(甚至 NOT NULL
约束)