现在我将根据事件类型在事件中插入数据。 但如果我有事件类型“假期”或“病假”,其中不包含任何区域。在这种情况下,数据将如何填充到事件表中。
由于事件类型“商务旅行”,区域表与其连接。
谢谢
最佳答案
如果没有任何区域与之关联是有意义的,那么只需使用 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_Trip
和 End_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
的详细信息,然后将其用作 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
您应该做出哪个选择应该由您的业务逻辑决定(我们无法帮助您)。
关于mysql - 防止在必填列中插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696491/