我想通过以下查询在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表,那么我的检查约束就可以正常工作了。但是在创建时,检查约束不能满足上述条件。
这就是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>
第一次尝试中,您尝试创建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异常。)