gpt4 book ai didi

sql - 甲骨文 SQL : how to enforce only one value may be 'checked' ?

转载 作者:行者123 更新时间:2023-12-02 09:29:25 25 4
gpt4 key购买 nike

所以我在数据库中有一个表,其中包含列“SELECTED”。此列中的值只能是“CHECKED”或“UNCHECKED”。我想通过 PL/SQL 触发器强制“CHECKED”只能使用一次(如单选按钮),尽管我想不出如何做到这一点。

首先,想法(如果没有变得清晰):

初始表“虚拟”:

ID | SELECTED
--------------
1 | 'UNCHECKED'
2 | 'CHECKED'
3 | 'UNCHECKED'

然后,我执行这个查询:

UPDATE dummy
SET SELECTED = 'CHECKED'
WHERE ID = 3;

通过 PL/SQL 触发器,我想让我的表“虚拟”在执行后看起来像这样:

ID | SELECTED
--------------
1 | 'UNCHECKED'
2 | 'UNCHECKED'
3 | 'CHECKED'

希望您能理解。我自己也曾尝试解决这个问题,但没有成功。我想出了以下代码:

CREATE OR REPLACE TRIGGER DUMMY_ONE_CHECKED 
AFTER INSERT OR UPDATE ON DUMMY
FOR EACH ROW
DECLARE
v_checked_is_present DUMMY.SELECTED%TYPE;
BEGIN
SELECT SELECTED
INTO v_checked_is_present
FROM DUMMY
WHERE SELECTED = 'CHECKED';

IF v_checked_is_present IS NOT NULL THEN
UPDATE DUMMY
SET SELECTED = 'UNCHECKED'
WHERE SELECTED = 'CHECKED';

UPDATE DUMMY
SET SELECTED = 'CHECKED'
WHERE ID = :NEW.ID;
END IF;
END;

但是,我收到错误 ORA-04091、ORA-06512 和 ORA-04088,并显示以下消息:

*Cause:    A trigger (or a user defined plsql function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
*Action: Rewrite the trigger (or function) so it does not read that table.

显然,这不是正确的解决方案。我想知道我如何才能完成我想做的事情(如果可能的话)?

提前致谢!

最佳答案

我不会那样设计的。数据库应该强制执行规则,而不是自动尝试修复违反规则的行为。

所以,我强制一次只能检查一行,如下所示:

CREATE UNIQUE INDEX dummy_enforce_only_one ON dummy ( NULLIF(selected,'UNCHECKED') );

然后,我会负责在选择新行之前调用代码取消选择其他行(而不是尝试让触发器执行此操作)。

我知道这并没有回答您问题的文本,但它确实回答了您问题的标题:“如何只执行一个值...”

关于sql - 甲骨文 SQL : how to enforce only one value may be 'checked' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34731198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com