mysql - 防止在必填列中插入数据

标签 mysql database oracle

我是oracle数据库的新手。我有三个表:enter image description here

现在我将根据事件类型在事件中插入数据。 但如果我有事件类型“假期”或“病假”,其中不包含任何区域。在这种情况下,数据将如何填充到事件表中。

由于事件类型“商务旅行”,区域表与其连接。

谢谢

最佳答案

如果没有任何区域与之关联是有意义的,那么只需使用 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 的详细信息,然后将其用作 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/

相关文章:

database - 多值属性可以具有复合属性吗?

database - 使用舞台区域失败。 AZURE 存储中的原因 : Server failed to authenticate the request.(状态代码:401;错误代码:InvalidAuthenticationInfo)

oracle - 强制 Hibernate 在 INSERT 之前发出 DELETE 以避免违反唯一约束?

javascript - 如何在jsp中保留mysql的last_insert_id()

php - 如果表为空,如何处理 json 格式错误显示

mysql - 仅当值不存在时返回行

php - 如何解决只获取最后一行更新的问题?

database - DOORS 数据库中的动态数组值得使用吗?

使用 to_date 的 Oracle 日期比较不起作用

sql - 如何用 SQL 删除 Oracle 数据库中的所有数据?