使用检查约束创建 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 NULLCONSTRAINT 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 约束)