如何制作引用两列的检查约束?

问题描述 投票:0回答:2

我想通过以下查询在Oracle中创建表Sp:

create table SP(Order_date date ,Dely_date date  check(Dely_date>Order_date));

但是问题是oracle显示错误“列检查约束不能引用其他列”

但是如果我创建此表时没有此条件check(Dely_date>Order_date)然后创建表。

告诉我为什么检查约束不能用于两列。

如果我使用此子句check(Dely_date>Order_date)更改SP表,那么我的检查约束就可以正常工作了。但是在创建时,检查约束不能满足上述条件。

database oracle constraints
2个回答
1
投票

这就是Oracle的做法-内联检查约束不能引用另一列。

解决方法?创建离线约束:

SQL> create table SP
  2    (Order_date date ,
  3     Dely_date  date,
  4     --
  5     constraint ch_date check (Dely_date > Order_date)
  6    );

Table created.

SQL>   insert into sp values (date '2020-03-03', date '2020-02-15');
  insert into sp values (date '2020-03-03', date '2020-02-15')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CH_DATE) violated


SQL>   insert into sp values (date '2020-03-03', date '2020-04-23');

1 row created.

SQL>

1
投票

第一次尝试中,您尝试创建inline约束。我们只允许在内联约束中引用拥有的列。您的ALTER TABLE语句成功,因为它创建了table level约束,并且表级约束可以引用多个列。

这为我们提供了如何修复代码的线索,因此您可以在CREATE TABLE语句中创建检查约束:

create table SP(Order_date date
               ,Dely_date  date 
               ,constraint dates_ck check(Dely_date > Order_date)
);

请注意constraint关键字前面的逗号:这使它成为表级(离线)约束。另外,请注意,我已将约束命名为dates_ck。命名约束始终是一个好习惯,但是在这种情况下,这是强制性的:如果不命名,就无法创建离线检查约束。 (尝试一下,它将抛出相同的ORA-02438异常。)

© www.soinside.com 2019 - 2024. All rights reserved.