0

我的 sql 数据库有一些问题需要解决:

  • 确保一名球员只能有 2 张黄牌或 1 张红牌
  • 一支球队不能有超过5名外国球员(国籍与法国不同的球员)

我的模型是这样的:

Team
-------
team_id (PK)
name

Player
-------
player_id (PK)
team_id (FK)
name
number_yellow_cards
number_red_cards
nationality

我认为触发器可以解决我的问题。这是我的触发器,但在任何情况下都不起作用(插入/更新)

create or replace TRIGGER foreign_players
Before Insert OR UPDATE on Player
FOR EACH ROW 
DECLARE nr_foreign_players INTEGER;
Begin

  IF INSERTING THEN
    SELECT Count(*) INTO nr_foreign_players
    FROM
        Team T
        INNER JOIN Player P ON P.team_id = T.team_id
    WHERE 
        P.team_id =  :new.team_id 
        AND P.nationality <> 'French';

    if(nr_foreign_players > 5) then
        Raise_Application_Error(-20000,'Error insert' ); 
    End If;
  END IF; --INSERTING

  IF UPDATING THEN
    SELECT Count(*) INTO nr_foreign_players
    FROM
        Team T
        INNER JOIN Player P ON P.team_id = T.team_id
    WHERE 
        P.team_id =  :new.team_id 
        AND P.nationality <> 'French';

    if(nr_foreign_players > 5) then
    Raise_Application_Error(-20000,'Error update' ); 
    End If;
  END IF; --UPDATING


End;

任何人都可以帮助我吗?

4

1 回答 1

0

这不能 100% 确定答案,因为您没有准确地告诉我们什么在任何情况下都不起作用

我发现您的触发器有几个问题:

  1. 确保一支球队不能拥有超过 5 名非法国球员的逻辑似乎是正确的,但是为什么要为INSERT和复制它UPDATE?这可以简化。

  2. 您根本没有验证一名球员只能有 2 张黄牌或 1 张红牌

这是一个更新的 SQL 代码,应该可以完成工作。它正在逐一执行每个检查,一旦检查失败,就会引发应用程序异常。INSERT和操作之间没有区别UPDATE,因为这两种操作的逻辑完全相同。

CREATE OR REPLACE TRIGGER foreign_players
BEFORE INSERT OR UPDATE ON Player
FOR EACH ROW 
DECLARE 
    nr_foreign_players INTEGER;
BEGIN

    IF NVL(:new.number_yellow_cards, 0) > 2 THEN
        Raise_Application_Error(-20000, 'Too many yellow cards' ); 
    END IF;

    IF NVL(:new.number_red_cards, 0) > 1 THEN
        Raise_Application_Error(-20000, 'Too many red cards' ); 
    END IF;

    SELECT Count(*) INTO nr_foreign_players
    FROM
        Team T
        INNER JOIN Player P ON P.team_id = T.team_id
    WHERE 
        P.team_id =  :new.team_id 
        AND P.nationality <> 'French';
    IF nr_foreign_players > 5 THEN
        Raise_Application_Error(-20000, 'Too many foreign players' ); 
    END IF;

END;
于 2018-12-18T22:06:43.697 回答