如何在Oracle 11g的一行中添加非空列和检查约束?

时间:2017-03-08 12:10:14

标签: oracle oracle11g

我尝试将新的INTEGER列添加到表中。该列必须为NOT NULL,默认值为1,并且只接受大于零的值。

我现在正试图这样做:

ALTER TABLE FOO_AUTHORS 
ADD PUBLICATION_PERIOD_DAYS INTEGER DEFAULT(1) NOT NULL
CONSTRAINT publicationPeriodDays 
CHECK (PUBLICATION_PERIOD_DAYS>0);

有没有办法在一行中执行此操作?我跟随this示例,但由于NOT NULL,它无法正常工作。那么NOT NULL是否必要?

我从数据库中收到以下错误:

  

QL错误:ORA-02293:无法验证(DBOWNER.PUBLICATIONPERIODDAYS) - 检查约束违反   02293. 00000 - "无法验证(%s。%s) - 检查违反约束"   *原因:alter table操作尝试验证检查约束              填充了具有无比值的表。

如果我在没有NOT NULL的情况下尝试它,它可以正常工作。

1 个答案:

答案 0 :(得分:2)

NOT NULL约束转换为CHECK约束:

ALTER TABLE FOO_AUTHORS 
  ADD PUBLICATION_PERIOD_DAYS INTEGER DEFAULT 1
  CONSTRAINT publicationPeriodDays
  CHECK ( PUBLICATION_PERIOD_DAYS IS NOT NULL AND PUBLICATION_PERIOD_DAYS > 0 );

现有行的PUBLICATION_PERIOD_DAYS设置为默认值。