【问题标题】:How do I add a constraint to this table using sql?如何使用 sql 向该表添加约束?
【发布时间】:2019-11-11 03:52:07
【问题描述】:

我有一个名为Student 的表,该表有两列Student_IdIs_Honor_Student(这是一个标志列01 代表真/假)

我有另一个名为 Honor_Student 的表,其中有 2 列 Student_IdClass_Id,以及一些与此问题无关的附加列。

当然是第三张表Class,它有一个Class_Id 列。

最后是一个名为Enrollment 的表,其中Student_IdClass_Id 引用StudentClass 表。

好的,所以我想要一个约束来检查如果学生是荣誉学生,那么在允许我将记录插入Enrollment 表之前,Honor_Student 表中必须存在一个条目。如果学生不是荣誉学生,则此限制不适用。我怎样才能做到这一点?

顺便说一句,我使用的是 jdbc liquibase,所以我将非常感谢任何使用 liquibase 的示例:https://www.liquibase.org/documentation/changes/add_check_constraint.html

但对于初学者来说,即使使用Alter Table 或可以使这成为可能的某种方法,我也非常感谢朝着正确的方向前进……从技术上讲,我认为我正在寻找带有@987654340 的“条件”外键约束@ 和 Class_Id 引用 Honor_Student 表,但前提是它是荣誉学生......这有点奇怪。

【问题讨论】:

    标签: mysql sql liquibase


    【解决方案1】:

    AFAIK 我想我正在寻找一个“有条件的”外键约束这可能是不可能的。

    您可以使用User Define FunctionConditional CHECK 约束:

    例如:

    UDF:

    CREATE FUNCTION IsHonarStudentExist (
        @Student_Id INT
    )
    RETURNS bit
    AS
    BEGIN
        IF EXISTS (SELECT * FROM Honor_Student WHERE Student_Id = @Student_Id)
            return 1
        return 0
    END
    

    检查约束:

    ALTER TABLE Student WITH CHECK
    ADD check (
        (Is_Honor_Student= 1 AND IsHonarStudentExist (Student_Id) = 1)
        OR
        (Is_Honor_Student= 0)
    

    注意:语法、数据类型和查询可能因您的数据库而异。 上面的代码只是一种方法。

    【讨论】:

    • hmm .. 在要存储数据的那个 tbl 上
    • so.. 我需要 2 个功能。一个看学生表告诉我它是否是荣誉学生。然后是另一个查看honor_student 表的函数,告诉我那里是否有条目。然后我可以在Enrollment 表中添加支票?似乎它会工作,但它看起来有点乱哈哈。真的需要这些功能吗?
    • 你可以在一个函数中marge all(Honor_Student ,Not Honor_Student ) 并在约束中直接调用函数你也不需要Conditional Check
    • 逻辑看你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2022-10-04
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多