SQL Oracle 约束值在多个列中唯一

标签 sql oracle tuples multiple-columns unique-constraint

假设我的表中有 3 列 - A、B 和 C。我想确保如果我在 A 列中插入一些值(例如 x),我无法插入包含 B 或 C 的元组等于 x,即对于所有元组,值 x 对于 A 列应保持唯一。

请注意,对于其他元组,x 可以在 A 中重复。

我知道 SQL 中的 UNIQUE 子句,但这只是为了确保某个值在特定列中仅出现一次。由于Oracle中的CHECK语句不允许子查询,我不知道如何实现它。

编辑(添加更多信息)

主键是 Employee_Number,而相关的 3 列是 LandlineNo、MobileNo 和 VOIP。因此假设这是一个条目:

Employee_Number = 1, LandlineNo = x, MobileNo = y, VOIP = z

那么另一个元组的这个条目将不被允许 -

Employee_Number = 2, LandlineNo = a, MobileNo = x, VOIP = c

另一方面,这个就可以了(是的,2 名员工可以拥有相同数量的相同类型)

Employee_Number = 2, LandlineNo = x, MobileNo = b, VOIP = c

最佳答案

CREATE MATERIALIZED VIEW mv_my
BUILD IMMEDIATE
REFRESH FAST ON COMMIT AS
SELECT DISTINCT
    CASE 
        WHEN t2.Employee_Number IS NOT NULL THEN 1
        WHEN t3.Employee_Number IS NOT NULL THEN 1
        WHEN t4.Employee_Number IS NOT NULL THEN 1
        ELSE 0
    END AS wrong
FROM table t1
    LEFT JOIN table t2 ON t2.MobileNo = t1.LandlineNo AND t2.Employee_Number != t1.Employee_Number
    LEFT JOIN table t3 ON t3.VOIP = t1.LandlineNo AND t3.Employee_Number != t1.Employee_Number
    LEFT JOIN table t4 ON t4.VOIP = t1.MobileNo AND t4.Employee_Number != t1.Employee_Number
/

ALTER TABLE mv_my ADD CHECK(wrong = 0)
/

它可能有效也可能无效,具体取决于您的 Oracle 版本 ( doc )

关于SQL Oracle 约束值在多个列中唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19744517/

相关文章:

python - 最好使用元组或 numpy 数组来存储坐标

sqlite char, ascii 函数

c# - 通过对 SQL 数据库的一次调用检索两个级别的数据

c++ - 加载共享库时出错 libclntsh.so.11.1 无法打开

oracle - 如何实现多维序列

oracle - 通过 CLOB 参数将巨大的 XML 从 C#/.Net 传递到 Oracle 存储过程 - ORA-01008 : not all variables bound

按月分组的 SQL 结果

sql在多个表中搜索

haskell - Haskell 中增加元组计数的函数

python - python中是否有等同于非唯一集的数据结构?