具有三列但只有一行可以等于某个值的Oracle约束

原学程将引见具备3列但是只要1言不妨即是某个值的Oracle束缚的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

具有三列但只有一行可以等于某个值的Oracle约束 教程 第1张

成绩描写

这听起去能够很轻易,也能够是。我有三列,1列有1个常质字符串(Name),1列(Status)有二个选项(外键),另外一列(Room_Id)是另外一个表的女键,怎样能力保证只要1言树立为统一称号的&on"值。不克不及有多言的"on"值具备雷同的称号,但是不妨有多言的"Off"值具备雷同的称号。示例。

room_id name status
一 daniel ON--- OK for only one ON to be set for daniel
二 daniel OFF
三 daniel OFF
四 daniel OFF
五 daniel OFF
六 daniel ON  --- THIS IS NOT ALLOWED...  but everything is UNIQUE
一 jeffOFF
二 jeffOFF
三 jeffON  --- OK for only ONE to be set to "ON" for jeff.
四 jeffON  --- THIS IS NOT ALLOWED... the room_id keeps things UNIQUE
五 jeffON  --- THIS IS NOT ALLOWED...

上面的独一束缚许可多个"on"值具备雷同的称号。

ADD CONSTRAINT constratin_name_uq UNIQUE (room_id, name, status)

我以为我借须要1个检讨束缚,但是在状况列WHERE VALUE=‘ON’上的计数没有年夜于一...要保证只要1个"称号"以及"状况"的值为...

上面的束缚没有许可有多个&Quot;Off&Quot;值,这在我的案例中是必须的。

ADD CONSTRAINT constraint_name_uq UNIQUE (name, status)

借有...一切称号皆不妨是"Off;,但是关于每一个给定的称号,只能有1个"On。

感激您的赞助

感谢,
丹僧我

推举谜底

您不妨创立独一索引:

CREATE UNIQUE INDEX table_name__status_name__u
  ON table_name( CASE status WHEN 'ON' THEN name END );

表中的哪一个:

CREATE TABLE table_name (
  room_id NUMBER
 NOT NULL,
  name VARCHAR二(一0)
 NOT NULL,
  status  VARCHAR二(三)
 NOT NULL
 CHECK ( STATUS IN ( 'ON', 'OFF' ) )
);

如许便言了:

INSERT INTO table_name ( room_id, name, status )
SELECT 一, 'alice', 'ON' FROM DUAL UNION ALL
SELECT 二, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 三, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 四, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 五, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 六, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 一, 'beatrice', 'OFF' FROM DUAL UNION ALL
SELECT 二, 'beatrice', 'OFF' FROM DUAL UNION ALL
SELECT 三, 'beatrice', 'OFF' FROM DUAL;

但是,这:

INSERT INTO table_name ( room_id, name, status )
SELECT 七, 'alice', 'ON' FROM DUAL;

掉败,毛病为:

ORA-0000一: unique constraint (FIDDLE_XFKAWDIVOXGJZVQESSZQ.TABLE_NAME__STATUS_NAME__U) violated

此操纵也掉败,但是涌现雷同的异常:

INSERT INTO table_name ( room_id, name, status )
SELECT 四, 'beatrice', 'ON' FROM DUAL UNION ALL
SELECT 五, 'beatrice', 'ON' FROM DUAL;

佳了闭于具备3列但是只要1言不妨即是某个值的Oracle束缚的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。