【问题标题】:Oracle SQL: How to create a constraint such that only one row in a group can be 'Checked' [duplicate]Oracle SQL:如何创建一个约束,使得组中只有一行可以被“检查”[重复]
【发布时间】:2022-02-25 05:25:20
【问题描述】:

在 Oracle SQL 中

假设一个表的结构如下:

ID NAME DESCRIPTION ACTIVE_FLAG
1 A1234567 Item Desc 1 Y
2 A1234567 Item Desc 2 N

我希望能够在此表上创建一个约束,以便允许以下操作:

INSERT INTO TBL (name, description, active_flag) VALUES('A1234567', 'Item Desc 3', 'N')
UPDATE TBL SET active_flag = 'N' WHERE ID = 1

但这些都不是:

INSERT INTO TBL (name, description, active_flag) VALUES('A1234567', 'Item Desc 3', 'Y')
UPDATE TBL SET active_flag = 'Y' WHERE ID = 2

基本上,我对一个约束感兴趣,这样对于共享 NAME 值的所有行,只有其中一个行可以将其活动标志设置为“Y”

如何实现这样的约束?

【问题讨论】:

  • 考虑在这样的约束下,记录更新的顺序很重要。在检查任何其他记录之前,您首先必须取消选中一条记录。如果您想使用 EF 的 SaveChanges() 保存大量更改,这可能是个问题。

标签: oracle


【解决方案1】:

你需要一个条件索引。像下面这样的东西应该适合你 -

CREATE UNIQUE INDEX IDX_UNQ_NAME ON YOUR_TABLE(CASE WHEN ACTIVE_FLAG = 'Y' 
                                                         THEN NAME
                                                    ELSE NULL
                                               END);

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2017-11-19
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多