我不能在列中添加具有 2 个相同值的行

Posted

技术标签:

【中文标题】我不能在列中添加具有 2 个相同值的行【英文标题】:I must not add row with 2 same values in columns 【发布时间】: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

【问题讨论】:

【参考方案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 中的有效语法。

以上是关于我不能在列中添加具有 2 个相同值的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定列中添加具有相同字符串值的行,并且不转换数据框? [重复]

SQL - 选择两列中具有相同值的行

如何对特定列中具有相同值的行求和

将列中具有相同值的行合并在一起

查找一列中具有相同值而另一列中具有其他值的行?

SQL - 在列中查找具有特定值组合的行