【问题标题】:SQL DDL Number rangeSQL DDL 编号范围
【发布时间】:2016-03-30 01:10:41
【问题描述】:

我试图编写一些 DDL 代码来询问数字范围,但在互联网上找不到任何我要查找的内容。 到目前为止,我有:

create table Section (
    c# numeric(10),
    se# numeric(10),
    emp# numeric(5),
    time numeric(5),
    constraint Section_PK primary key (c#, se#),
    constraint Section_FK_Course foreign key (c#) references Course,
    constraint Section_FK_Employee foreign key (emp#) references Employee
)

我的障碍在哪里,我需要“控制号”是40到60之间的任何数字,默认为20,同时,如果c#在3000到4000之间,那么控制号必须是小于 40。

我真的很困惑如何做到这一点。这是一种“如果那么”的陈述吗?我以前没有做过这样的事情,不知道如何或从哪里开始寻找。

【问题讨论】:

  • 什么是“控制号”,它的用途是什么?
  • @Amit 我很抱歉,我忘了将它添加到原始列表中。我有点困惑是否应该添加它。我认为,它应该是control number numeric(4),,但这确实是我所掌握的所有信息。
  • 这个说法是否正确——“我需要让“控制号”为 40 到 60 之间的任意数字,并且默认为 20”?如果它必须在 40 到 60 之间,怎么能默认为 20?
  • 是的,我已经仔细检查过了,他们希望它在 40 到 60 之间,但默认为 20。我认为这只是意味着如果它是 Null,则将 20 作为占位符。我不知道这是什么逻辑。

标签: sql constraints ddl


【解决方案1】:

您可以查看check constraint:

检查约束是 SQL 中的一种完整性约束,它 指定数据库中每一行必须满足的要求 桌子。约束必须是谓词。它可以指单个或 表的多个列。谓词的结果可以是 TRUE、FALSE 或 UNKNOWN,取决于 NULL 的存在。如果 谓词计算为 UNKNOWN,则约束不是 违反并且可以在表中插入或更新该行。这是 与 SELECT 或 UPDATE 中的 WHERE 子句中的谓词相反 声明。

例如,在包含产品的表中,可以添加一个检查 约束使得产品的价格和产品的数量 是一个非负值:

PRICE >= 0

QUANTITY >= 0

如果没有这些限制,可能会有负价格(-30 美元)或负数量(-3 件商品)。

检查约束用于确保数据的有效性 数据库并提供数据完整性。如果它们用于 数据库级别,使用数据库的应用程序将无法 添加无效数据或修改有效数据使数据无效, 即使应用程序本身接受无效数据。

不同的 rdbms 产品以不同的方式实现检查约束(有些根本没有),因此请查看您的 rdbms 的检查约束手册。

【讨论】:

  • 所以约束检查为我节省了一些记忆。因此,如果我理解这一点,最初我会有control_number numeric(5) default '20',然后是一个约束,例如:constraint constraint Section_control_number check (control_number > 40 AND control_number < 60)
  • 如果 'c# is within 3000 to 4000' 条件呢?我在您的约束代码中看不到这一点。但这是你的代码,你的数据,你可以自己测试约束。
  • 那是我要跨越的下一座桥。最重要的是,我实际上无法“测试”代码。除了ERD之外,您拥有的所有信息都是我得到的。我最初的想法类似于 if-then 函数,但我知道这不是解决方案。
  • 很抱歉,在这种情况下我无法为您提供更多帮助。
  • 没关系。我有机会与我所在部门的其他人交谈,显然这是我们目前最“知名”的解决方案。无论如何,感谢您的所有帮助。
【解决方案2】:

我更倾向于推荐基于trigger 的方法,而不是check constraint。您不能将 check constraint 限制在 40 和 60 之间,然后将 default 值限制为 20。它们会相互冲突。使用trigger,您可以执行所有这些检查并返回错误消息,告诉用户insert 失败的原因。

但是,您必须进行一些测试以查看触发器的性能是否处于可接受的水平。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2019-05-05
    • 1970-01-01
    • 2010-11-16
    • 2023-03-27
    相关资源
    最近更新 更多