根据表中的实例数限制数据输入

Posted

技术标签:

【中文标题】根据表中的实例数限制数据输入【英文标题】:Limit data input based on count of instances in table 【发布时间】:2016-02-29 22:43:26 【问题描述】:

甲骨文 12c。

我目前有一个表格来保存患者就诊,其中包含医生 ID、患者 ID 和就诊数据/时间。

我想创建一个约束,在数据输入时检查特定医生在给定日期是否有 5 次预约。如果医生确实有 5 次预约,则不能再添加预约。

除了使用存储过程进行输入之外,还有其他方法吗?

如果我要使用存储过程(而不是由于声明变量的问题而触发),我会收到以下错误:Error(4,8): PLS-00103: Encountered the symbol "UPDATE" when expecting a以下: := 。 ( @ % ; 非空范围默认字符

我不确定这是否是因为我不能在程序上使用 BEFORE UPDATE。有什么想法吗?

CREATE OR REPLACE PROCEDURE doc_apt_limit_5
IS
v_visit_count
BEFORE UPDATE OR INSERT ON aa_patient_visit
FOR EACH ROW
BEGIN
SELECT (COUNT(*)) INTO v_visit_count
FROM aa_patient_visit
WHERE physid = :NEW.physid
GROUP BY physid, visittime;
IF v_visit_count > 4 THEN
RAISE_APPLICATION_ERROR(-20001, 'physician is fully booked     on     this date');
END IF;
END;

【问题讨论】:

触发器似乎是一种自然的解决方案,但它的想法基本相同。 我认为这可能是最好的路线。我尝试使用过程来执行此操作,因为我在使用触发器声明变量时遇到问题,但是收到错误。我已将此添加到我的原始帖子中。再次感谢 之前(或之后)仅适用于触发器,不适用于过程。在触发器中声明变量不是问题。但是,由于并发性(两个插入/更新同时无法看到彼此),除非您以某种方式进行序列化和变异表问题,否则尝试强制执行这种约束。无论如何,这似乎是一个奇怪的限制 - 约会数量而不是约会空缺。 能否请您扩展“相当满的预约空档”?我假设这本身就是一个单独的表,但不确定它是如何工作的。 我的意思是我希望预约系统能够将患者分配到预约时段(时间段),并检查它们是否重叠(如果您喜欢的话,可能会有间隙) .仅仅计算它们并没有多大帮助 - 它们可以重叠,并且可能有不同的长度。 【参考方案1】:

使用触发器。在这种情况下可能是最好的解决方案。

CREATE OR REPLACE TRIGGER doc_apt_limit_5 BEFORE
  UPDATE OR
  INSERT ON aa_patient_visit FOR EACH ROW 
  DECLARE v_visit_count PLS_INTEGER;
  BEGIN
    SELECT COUNT(*)
    INTO v_visit_count
    FROM aa_patient_visit
    WHERE physid = :NEW.physid
    GROUP BY physid,
      visittime;
    IF v_visit_count > 4 THEN
      RAISE_APPLICATION_ERROR(-20001, 'physician is fully booked     on     this date');
    END IF;
  END;

【讨论】:

您将如何处理无法看到彼此更改的同时插入/更新?和变异表错误? @Alex:让我们使用语句级触发器而不是行级触发器,如图所示。

以上是关于根据表中的实例数限制数据输入的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据库表中的最大记录数

从一个表中的多个表中计数代码返回 0

根据 id 列的条目数查询以将表中的数据聚合到另一个表中

COUNT() 返回分组表中的总行数

无法根据在搜索字段中输入的值显示表中的数据[关闭]

Spring根据表中的行数生成ID