Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle的Check语句中使用子查询_Sql_Database_Oracle - Fatal编程技术网

Sql 在Oracle的Check语句中使用子查询

Sql 在Oracle的Check语句中使用子查询,sql,database,oracle,Sql,Database,Oracle,所以我试图解决这个问题,但最后一行(检查)似乎不允许子查询。有没有办法让这一切顺利 CREATE TABLE Tank ( n_id int, day date, level int, CONSTRAINT pk_w_td PRIMARY KEY (n_id,day), CONSTRAINT fk_w_td_tan FOREIGN KEY (n_id) REFERENCES Tanks ON

所以我试图解决这个问题,但最后一行(检查)似乎不允许子查询。有没有办法让这一切顺利

CREATE TABLE Tank (
    n_id            int,
    day             date,
    level           int,
    CONSTRAINT pk_w_td PRIMARY KEY (n_id,day),
    CONSTRAINT fk_w_td_tan FOREIGN KEY (n_id) REFERENCES Tanks ON DELETE CASCADE,
    CHECK (level > 0 AND level <= (SELECT capacity FROM Tanks WHERE Tanks.n_id = TanksDay.n_id))
);

不遗憾的是,检查约束不能包含子查询-请参阅。

如果超出允许的范围,您可能需要创建触发器并使用
引发应用程序错误。

有三种基本方法可以解决此类问题,因为检查约束不能基于查询

选项1:触发器

最简单的方法是在坦克上设置一个触发器,该触发器查询坦克并在液位超过容量时抛出异常。然而,这种简单化方法的问题是,几乎不可能正确处理并发问题。如果会话1减少容量,那么会话2增加级别,然后两个事务提交触发器将无法检测到冲突。如果一个或两个表很少修改,这可能不是问题,但一般来说,这将是一个问题

选项2:物化视图


您可以通过创建一个连接TANK和TANKS表的oncommit物化视图,然后在物化视图上创建一个CHECK约束,以验证LEVELJustin的答案是否有一些好主意来解决并发性问题。另一种方法是使用包(如果愿意,可以使用TAPI)包装表中的所有插入/更新,并在那里实现检查。您需要确保所有应用程序都使用您的TAPI。您还需要实现一些自定义锁定,以保护约束不受并发活动的影响。

< P>您所寻找的特性称为SQL断言,

以及创建触发器时要考虑的另一件事。你可能需要在桌子上放置一个触发器,以确保它不会小于最大值。问得好。一般的跨表约束(除了FK约束)是我最希望看到添加到Oracle的功能之一。我同意,断言可以完美地解决此类需求。
Error at Command Line:7 Column:32 Error report: SQL Error: ORA-02251: subquery not allowed here
02251. 00000 -  "subquery not allowed here"
*Cause:    Subquery is not allowed here in the statement.
*Action:   Remove the subquery from the statement.