4

我是第一次使用 oracle,我有一个名为 ExpenseReport 的表,其中存储有关费用的详细信息。

我希望 ApprUserNo 允许 Nulls IF ERStatus = 'PENDING' 任何帮助将不胜感激,我整个早上都在尝试排序

CREATE TABLE ExpenseReport 
(
  ERNo           NUMBER(10) NOT NULL,
  ERDesc         VARCHAR2(255) NOT NULL,
  ERSubmitDate   DATE NOT NULL,
  ERStatusDate   DATE NOT NULL,
  ERStatus       VARCHAR2(8) DEFAULT 'PENDING' NOT NULL,
  SubmitUserNo   NUMBER(10) NOT NULL,
  ApprUserNo     NUMBER(10) NOT NULL CONSTRAINT BEN_Check CHECK (ERStatus LIKE('PENDING')),
  UsersUserNo    NUMBER(10) NOT NULL,
  AssetAssetNo   NUMBER(10) NOT NULL,
  PRIMARY KEY (ERNo),
  CONSTRAINT Check_ER_Date CHECK (ERStatusDate >= ERSubmitDate),
  CONSTRAINT ERStatus_Null_Exception CHECK (IF ERStatus = 'PENDING',AppUserNo = NULLABLE),
  CONSTRAINT ERStatus_Option CHECK (ERStatus = 'PENDING','APPROBED','DENIED')
)
4

2 回答 2

8

你需要重新形成你的约束。

首先,如果您希望一个字段包含空值,无论任何其他规则如何,它都必须是一个可为空的字段。

ApprUserNo     NUMBER(10)   NULL,   -- No Check Constrain

其次,创建一个约束,说 ApprUserNo 不能为 NULL,除非ErStatus = 'PENDING'

CONSTRAINT ERStatus_Null_Exception CHECK (AppUserNo IS NOT NULL OR ERStatus = 'PENDING'),
于 2012-04-04T10:47:37.837 回答
0

这应该这样做:

CONSTRAINT ERStatus_Null_Exception 
     CHECK (ERStatus <> 'PENDING' AND AppUserNo IS NOT NULL)


您还应该更改:
CONSTRAINT BEN_Check CHECK (ERStatus LIKE('PENDING'))
因为
CONSTRAINT BEN_Check CHECK (ERStatus = 'PENDING')
a) LIKE 不是函数并且 b) LIKE 没有通配符没有意义。

然后你在这里有另一个错误:
CONSTRAINT ERStatus_Option CHECK (ERStatus = 'PENDING','APPROBED','DENIED')
那应该是
CONSTRAINT ERStatus_Option CHECK (ERStatus IN ('PENDING','APPROBED','DENIED'))

请重新阅读 Oracle 手册中记录 CREATE TABLE 和 SQL 条件的语法的章节。

于 2012-04-04T10:31:26.950 回答