您可以创建唯一索引:
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
并且这也会失败并出现相同的异常:
INSERT INTO table_name ( room_id, name, status )
SELECT 4, 'beatrice', 'ON' FROM DUAL UNION ALL
SELECT 5, 'beatrice', 'ON' FROM DUAL;
数据库小提琴