Oracle 唯一密钥[自定义]

Oracle 唯一密钥[自定义],oracle,Oracle,我有一张桌子来存放我的地址。有一个字段用于标识当前地址或活动地址。员工可以有多个地址,但只能有一个活动地址。地址状态字段只有两种状态,即当前和旧。它们由ids 1表示活动,2表示旧。因此,在表中,一名员工只能包含一个活动地址或地址\状态=1,但多个地址\状态=2 请建议如何解决上述情况。您可以这样做: CREATE TABLE EMPLOYEE ( address VARCHAR2(100) NOT NULL, address_status INTEGER, addres

我有一张桌子来存放我的地址。有一个字段用于标识当前地址或活动地址。员工可以有多个地址,但只能有一个活动地址。地址状态字段只有两种状态,即当前和旧。它们由ids 1表示活动,2表示旧。因此,在表中,一名员工只能包含一个活动地址或地址\状态=1,但多个地址\状态=2


请建议如何解决上述情况。

您可以这样做:

CREATE TABLE EMPLOYEE (
    address VARCHAR2(100) NOT NULL,
    address_status INTEGER,
    address_status_text VARCHAR2(20) GENERATED ALWAYS AS (CASE address_status WHEN 1 THEN 'active' ELSE 'old' END)
    );

ALTER TABLE EMPLOYEE ADD CONSTRAINT ADDRESS_STATUS CHECK (ADDRESS_STATUS IS NULL OR ADDRESS_STATUS = 1);
ALTER TABLE EMPLOYEE ADD CONSTRAINT ADDRESS_ACTIVE UNIQUE (ADDRESS_STATUS);


INSERT INTO EMPLOYEE (address, address_status) VALUES ('New York', 1);
INSERT INTO EMPLOYEE (address, address_status) VALUES ('Houston', NULL);
INSERT INTO EMPLOYEE (address, address_status) VALUES ('Houston', NULL);
INSERT INTO EMPLOYEE (address, address_status) VALUES ('Los Angeles', NULL);

SELECT *
FROM EMPLOYEE;


+----------------------------------------------+
|ADDRESS    |ADDRESS_STATUS|ADDRESS_STATUS_TEXT|
+----------------------------------------------+
|Houston    |              |old                |
|Houston    |              |old                |
|Los Angeles|              |old                |
|New York   |1             |active             |
+----------------------------------------------+

您可以使用条件唯一索引,如:

CREATE UNIQUE INDEX ADDRESS_IDX01
ON ADDRESS (CASE WHEN ADDRESS_STATUS = 1
THEN EMPLOYEE_ID -- please change the name of the colum refering to employee or accordingly
ELSE NULL
END);

干杯

你试过什么?您能描述一下您遇到的问题吗?活动地址使用address_status=1,旧地址使用address_status=NULL。然后,您可以在地址、地址和状态上定义一个唯一键