【问题标题】:I must not add row with 2 same values in columns我不能在列中添加具有 2 个相同值的行
【发布时间】:2021-04-24 00:07:41
【问题描述】:

我能否在创建表格时输入一条规则,这样我作为作者就不能向我已经评论过的产品添加评论? 我一直在考虑触发器,但我不知道如何设置它。在工作台中,我可以通过以下代码进行检查:

declare
  pocet number := 0;
begin
  SELECT COUNT(a."id_recenze")
INTO pocet
FROM "recenze" a
INNER JOIN (SELECT "id_komponenty", "id_autora"
            FROM "recenze"
            GROUP BY "id_komponenty", "id_autora"
            HAVING COUNT(*) > 1) b
ON a."id_komponenty" = b."id_komponenty" AND a."id_autora" = b."id_autora";

  if pocet > 2 then
      DBMS_OUTPUT.put_line('Nesmite vytvaret recenzi na komponentu, u ktere jste uz recenzoval');
  else
    DBMS_OUTPUT.put_line('Vysledek je v poradku');
  end if;
end;

但我不想创建这些记录。

谁能帮助我,我该怎么做? 我使用 Oracle 的 APEX。

编辑:(24.4. 10:35)


简而言之,我不想要记录,其中 id_autora 和 id_komponenty 的次数更多。例如我不想要这个:

id_recenze(PK) id_autora id_komponenty
    1             2           3
    2             2           3

【问题讨论】:

    标签: sql oracle oracle-apex


    【解决方案1】:

    在您的解释之后,我发现您仍然可以使用唯一索引,但您想在 id_komponenty 和 id_autora 上创建它。如果您尝试添加重复项,则会引发错误。

    但我从您的代码中看到,如果重复值,您正在尝试使用最新值进行更新。在那种情况下,我会放弃索引和触发器的想法,我会用 Oracle 的 MERGE 语句替换 INSERT 语句(未显示)。这允许同时进行插入和更新逻辑,并且您可以在执行任一操作时定义标准。它看起来像:

        MERGE INTO recenze r 
        USING (Select <newid_komponenty> AS newk
                                  ,<newid_autora AS newa> from Dual) n
          ON (r.id_komponenty=n.newk And r.id_autora=n.newa)
        WHEN MATCHED THEN UPDATE SET {your update logic here}
        WHEN NOT MATCHED THEN INSERT {your insert logic here}
    

    就我个人而言,当有其他解决方案可用时,我会尽量远离触发器。通过将您的 Insert 语句更改为此 Merge,您可以获得相同的效果,只需少一个 DB 对象来跟踪和维护。

    【讨论】:

    • 我的 id_recenze 是独一无二的,也许我用不好的方式解释了这个问题。看编辑:)
    【解决方案2】:

    我明白了。

        CREATE TRIGGER "nesmiPridat" BEFORE INSERT ON "recenze"
    FOR EACH ROW BEGIN
    DECLARE pocet INT(2);
    DECLARE smazat INT(2);
    
    SET pocet := (SELECT COUNT("id_recenze") FROM "recenze" WHERE (NEW."id_autora" = "id_autora") AND (NEW."id_komponenty" = "id_komponenty"));
    SET smazat :=(SELECT "id_recenze" FROM "recenze" WHERE (NEW."id_autora" = "id_autora") AND (NEW."id_komponenty" = "id_komponenty"));
    
    IF (pocet > 0) THEN
    DELETE FROM "recenze" WHERE smazat."id_recenze" = NEW."id_recenze";
    END IF;
    
    END;
    

    【讨论】:

    • 这不是 Oracle PL/SQL 中的有效语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多