本文介紹了具有三列但只有一行可以等于某個值的Oracle約束的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
這聽起來可能很容易,也可能是。我有3列,一列有一個常量字符串(Name),一列(Status)有兩個選項(外鍵),另一列(Room_Id)是另一個表的父鍵,如何才能確保只有一行設(shè)置為同一名稱的&on";值。不能有多行的";on";值具有相同的名稱,但可以有多行的";Off";值具有相同的名稱。示例。
room_id name status
1 daniel ON --- OK for only one ON to be set for daniel
2 daniel OFF
3 daniel OFF
4 daniel OFF
5 daniel OFF
6 daniel ON --- THIS IS NOT ALLOWED... but everything is UNIQUE
1 jeff OFF
2 jeff OFF
3 jeff ON --- OK for only ONE to be set to "ON" for jeff.
4 jeff ON --- THIS IS NOT ALLOWED... the room_id keeps things UNIQUE
5 jeff ON --- THIS IS NOT ALLOWED...
下面的唯一約束允許多個";on";值具有相同的名稱。
ADD CONSTRAINT constratin_name_uq UNIQUE (room_id, name, status)
我認為我還需要一個檢查約束,但在狀態(tài)列WHERE VALUE=‘ON’上的計數(shù)不大于1…要確保只有一個";名稱";和";狀態(tài)";的值為…
下面的約束不允許有多個&Quot;Off&Quot;值,這在我的案例中是必需的。
ADD CONSTRAINT constraint_name_uq UNIQUE (name, status)
還有…所有名稱都可以是";Off;,但對于每個給定的名稱,只能有一個";On。
感謝您的幫助
謝謝,
丹尼爾
推薦答案
您可以創(chuàng)建唯一索引:
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 VARCHAR2(10)
NOT NULL,
status VARCHAR2(3)
NOT NULL
CHECK ( STATUS IN ( 'ON', 'OFF' ) )
);
這樣就行了:
INSERT INTO table_name ( room_id, name, status )
SELECT 1, 'alice', 'ON' FROM DUAL UNION ALL
SELECT 2, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 3, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 4, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 5, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 6, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 1, 'beatrice', 'OFF' FROM DUAL UNION ALL
SELECT 2, 'beatrice', 'OFF' FROM DUAL UNION ALL
SELECT 3, 'beatrice', 'OFF' FROM DUAL;
然而,這:
INSERT INTO table_name ( room_id, name, status )
SELECT 7, 'alice', 'ON' FROM DUAL;
失敗,錯誤為:
ORA-00001: unique constraint (FIDDLE_XFKAWDIVOXGJZVQESSZQ.TABLE_NAME__STATUS_NAME__U) violated
此操作也失敗,但出現(xiàn)相同的異常:
INSERT INTO table_name ( room_id, name, status )
SELECT 4, 'beatrice', 'ON' FROM DUAL UNION ALL
SELECT 5, 'beatrice', 'ON' FROM DUAL;
小提琴here
這篇關(guān)于具有三列但只有一行可以等于某個值的Oracle約束的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,