在 SQL 数据库中输入最小/最大行数
Posted
技术标签:
【中文标题】在 SQL 数据库中输入最小/最大行数【英文标题】:Entering minimum/ maximum number of rows in a SQL database 【发布时间】:2020-11-10 14:52:08 【问题描述】:我们如何强制用户输入一定数量的行。 例如,如果一个学生必须参加一门课程的 5 个科目,我们如何应用这些类型的约束或如何强制用户输入最小行数或最大行数。
例如:一个学生可以为该课程选择最少 5 个和最多 6 个科目。 如果我们要考虑架构或数据库表并牢记这些约束,我们应该如何在 oracle 中创建一个表。
【问题讨论】:
这听起来像是应该在应用程序/业务逻辑中的东西,此时用户选择了一些东西 - 大概是从 GUI 中的列表中 - 而不是在数据库约束中。您可能在表格顶部有一个物化视图,用于计算行数并对其进行约束;但它必须被推迟,否则你将无法插入任何东西(除非你使用insert all
,也许)。不过这似乎有点乱。
【参考方案1】:
确实没有方便的方法来强制执行多行约束。问题是您的数据库将在某些时候违反约束,即使您知道它最终不会。比如,在你的学生报读一门学科之后,你又要报读四门学科,你就违规了。
这里的关键是 deferrable constraint。这些在事务提交之前不会被强制执行。即使一个约束被创建为可延迟的,默认情况下,它仍然会立即执行。因此,您可能希望将约束创建为DEFERRABLE INITIALLY DEFERRED
。这看起来像:
subject_count NUMBER(10) NOT NULL DEFAULT 0,
CONSTRAINT ck_subject_count CHECK ( subject_count BETWEEN 5 AND 6 )
DEFERRABLE INITIALLY DEFERRED
好的,所以你知道你需要一个可延迟的约束。你把它放在什么上面?你基本上有两个选择。您需要一个表格,其中每个学生有一行以及该学生的科目总数。您可以将该总数作为应用程序代码的一部分进行维护,通过触发器为每次插入增加列并为每次删除减少列,或者使用提交时可刷新的物化视图。就个人而言,我可能会使用表 + 触发器。
【讨论】:
以上是关于在 SQL 数据库中输入最小/最大行数的主要内容,如果未能解决你的问题,请参考以下文章