2012-02-25 133 views
1

我需要一个DB,我在工作的一些建议。约束双重检查

我有DB,现在我的工作过程,函数和触发器(PL/SQL )。有三个实体,其中两个从第三个实体继承(按照概念数据模型),所以这意味着有两个表引用第三个实体。我必须同时在“父”表和“子”表中插入数据,所以我想过在父表中插入一个过程,而另一个插入到子表中,可以调用前一个。

我的问题是,如果我试图插入到父表中,然后再插入到子表中,并且由于某种原因我将数据插入到不满足约束条件的子表中,会发生什么?换句话说,尽管有这些限制,我还是还有必须验证函数中的输入数据吗?你有什么建议?

回答

2

这取决于。

假设子表和父表之间存在外键约束,如果您尝试使用父表中不存在的键在子表中插入一行,则INSERT将引发异常该约束被违反。如果您仅希望INSERT操作因违反约束条件异常而失败,则不需要检查任何内容。

另一方面,您可能想要验证代码以便为调用者提供更好的例外。例如,一个表有多个引用各种其他表的外键是比较常见的。检查参数是否有效可能是有益的,这样您可以更明确地告诉调用者哪个参数无效。

如果您要求如何确保插入到父表中并插入到子表中,或者两者都失败,那么您正在讨论如何建立正确的事务边界。你会做这样的事情

BEGIN 
    insert_into_parent(<<list of parameters>>); 
    insert_into_child( <<list of parameters>>); 
    commit; 
EXCEPTION 
    WHEN others 
    THEN 
    rollback; 
    RAISE; 
END; 

请注意,你的PL/SQL应用程序总是要明确地提交或回滚。那些交易控制报表应该处于最高水平。例如,您不希望在insert_into_parent过程中拥有事务控制语句,因为如果您想要更广泛的事务范围,则永远无法使用该过程。

+0

是的,有外键约束,但这不是重点,而是剩下的表约束。例如,假设我有这张表,并且它有一定的CHECK约束。如果我在第二个表中插入数据(在第一个表中成功插入数据之后),并由于某种原因抛出异常,因为它违反了约束,数据将记录在第一个表中,而不是第二个表中的数据。这就是我所担心的。 – 2012-02-25 02:02:28

+2

@ user1231958 - 这是事务边界的用途。如果插入到子表中失败并且您不希望插入到父表中,除非两个插入操作都成功,否则如果插入到子表中的过程抛出异常而不是抛出异常,则应用程序将简单地发出回滚发出提交。 – 2012-02-25 02:19:06

+0

我是否必须发出回滚指令,还是自动执行?如果我在一个过程中的一个表中插入一个插入,然后从另一个过程调用它,如何?程序A - >调用程序B - >程序B插入并返回 - >程序A插入。另外还有 – 2012-02-25 02:26:10