【问题标题】:Creating an Oracle trigger to increment/decrement an attribute based on its uniqueness in another table创建 Oracle 触发器以根据属性在另一个表中的唯一性来增加/减少属性
【发布时间】:2015-12-07 06:03:56
【问题描述】:

我正在制作一个数据库来为游戏行业建模,它有两个看起来有点像这样的表:

PLAYABLE (Which games are playable on which consoles)
--------------------------------------------------
|  Game_ID (int)   | Console_Name (varchar(255)) | (both primary/foreign)
--------------------------------------------------

 CONSOLE
--------------------------------------------------
|  Console_Name (PK) |     Exclusives (int)      |
--------------------------------------------------

exclusives 属性给出了该控制台(并且只有该控制台)拥有的游戏数量。

因此,当我在“Playable”关系中插入一个新元组时,如果该“Game_ID”已经存在一次,那么我需要使用相应的“Console_Name”递减“Exclusives”属性。同样,如果它不存在,那么我会增加该控制台的独占数量。

我是 Oracle 新手,这是我为此创建触发器的尝试:

CREATE OR REPLACE TRIGGER Exclusives_Count
    BEFORE INSERT ON Playable
    FOR EACH ROW
BEGIN
    DECLARE
        Game_Count NUMBER;
        Obsolete_Exclusive_Console VARCHAR(255);
    SELECT COUNT(Game_ID) INTO Game_Count FROM Playable WHERE Game_ID = :NEW.Game_ID;
    IF Game_Count = 0
    THEN 
        UPDATE Console
        SET Exclusives = Exclusives + 1
        WHERE Console.Console_Name = :NEW.Console_Name;
    ELSIF Game_Count = 1
    THEN
        SELECT Console_Name INTO Obsolete_Exclusive_Console FROM Playable WHERE Game_ID = :NEW.Game_ID;

        UPDATE Console
        SET Exclusives = Exclusives - 1
        WHERE Console.Console_Name = Obsolete_Exclusive_Console;
    END IF;
END;
/

输入这个会给我“警告:触发器创建时出现编译错误”,但我不确定我哪里出错了。

【问题讨论】:

    标签: sql oracle triggers


    【解决方案1】:

    declare 应该在您的代码中的 begin 之前 请参阅下面的声明:

    create table Playable(Game_ID int, Console_Name varchar(255));
    create table CONSOLE(Console_Name  varchar(255), Exclusives int);
    SQL> 
    SQL> CREATE OR REPLACE TRIGGER Exclusives_Count
      2      BEFORE INSERT ON Playable
      3      FOR EACH ROW
      4  
      5  DECLARE
      6          Game_Count NUMBER;
      7          Obsolete_Exclusive_Console VARCHAR(255);
      8  BEGIN
      9  
     10      SELECT COUNT(Game_ID) INTO Game_Count FROM Playable WHERE Game_ID = :NEW.Game_ID;
     11      IF Game_Count = 0
     12      THEN
     13          UPDATE Console
     14          SET Exclusives = Exclusives + 1
     15          WHERE Console.Console_Name = :NEW.Console_Name;
     16      ELSIF Game_Count = 1
     17      THEN
     18          SELECT Console_Name INTO Obsolete_Exclusive_Console FROM Playable WHERE Game_ID = :NEW.Game_ID;
     19  
     20          UPDATE Console
     21          SET Exclusives = Exclusives - 1
     22          WHERE Console.Console_Name = Obsolete_Exclusive_Console;
     23      END IF;
     24  END;
     25  /
    
    Trigger created
    
    SQL> show errors
    No errors for TRIGGER SCM.EXCLUSIVES_COUNT
    
    SQL> 
    

    【讨论】:

    • 嗯,谢谢,但它似乎没有修复它。我仍然收到与原始帖子中提到的相同的警告。
    • 我在 sql plus 中创建了触发器并检查了错误 - 如您所见 - 没有错误
    • @EmmetOT 如果您使用双引号创建表格,请确保始终使用双引号引用它们。
    • 好吧,我的第二个问题是一个愚蠢的问题......“Console_Name”属性实际上只是“名称”。很抱歉浪费您的时间,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2022-06-29
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多