防止在强制列中插入数据

时间:2016-02-29 09:54:22

标签: mysql database oracle

我是oracle数据库的新手。我有三张桌子:enter image description here

现在我要根据事件类型在Event中插入数据。 但如果我有活动类型"假期"或者"病假"它不包含任何区域。在这种情况下,如何在事件表中填充数据。

由于事件类型"商务旅行"。

,区域表与之相关联

感谢,

1 个答案:

答案 0 :(得分:0)

如果没有任何区域与之关联,那么只需使用NULL作为外键值:

INSERT INTO Event ( ID, Event_Type, User_ID, Start_Trip, End_Trip, Start_Date, End_Date )
VALUES            ( 1, 'Sick Leave', 1, NULL, NULL, DATE '2016-02-29', DATE '2016-03-31' );

在这种情况下,Start_TripEnd_Trip列应该可以为空 - 如果这是一个问题,那么您可以将这些列上的NOT NULL约束转换为CHECK约束。即。

CHECK ( ( UPPER( Event_Type ) IN ( 'SICK LEAVE', 'VACATION' )
          AND Start_Trip IS NULL
          AND End_Trip IS NULL )
      OR
        ( UPPER( Event_Type ) NOT IN ( 'SICK LEAVE', 'VACATION' )
          AND Start_Trip IS NOT NULL
          AND End_Trip IS NOT NULL )
      )

如果添加了另一个应为null的事件类型,则会出现维护数据的问题,在这种情况下,开发人员必须修改表约束。 (可以通过包含事件类型表来解决,其中包含区域是否为NULL的详细信息,然后将其用作Event表中的外键。)

如果有一个区域是有意义的(例如,如果用户生病或休假,那么可能与他们的家乡区域相关联),那么使用适当的区域ID:

INSERT INTO Event ( ID, Event_Type, User_ID, Start_Trip, End_Trip, Start_Date, End_Date )
SELECT 1, 'Sick Leave', ID, Region_Id, Region_Id, DATE '2016-02-29', DATE '2016-03-31'
FROM   PT_USER
WHERE  ID = 1; -- The user's ID

您应该根据您的业务逻辑确定您应该做出的选择(我们无法帮助您)。