Oracle SQL create unique INDEX constraint based on status column and other 4 列
Oracle SQL create unique INDEX constraint based on status column and other 4 column
我需要 UNIQUE INDEX CONSTRAINT 用于以下示例:
CREATE TABLE DEMO(
COL_1 number,
COL_2 number,
COL_3 number,
COL_4 number,
STATUS number)
;
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0); --Allow insert
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1); --Allow insert
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0); --Allow insert
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1); --Not allow insert status 1 already exits!
您只需要在 STATUS 列上有一个条件索引。您可以尝试以下查询 -
CREATE UNIQUE INDEX UNQ_IDX_STATUS ON DEMO (CASE WHEN STATUS = 1 THEN STATUS ELSE NULL END);
这将仅在 STATUS 列的值为 1 时应用约束,否则不会影响此列中的其他值。
这是您可以对数据库模型施加的第 12 个 伪 约束(基于 constraint types),不需要使用子句 CONSTRAINT
定义它。
您可以创建部分唯一索引来实施它。例如:
create unique index ix1 on demo (
case when status = 1 then col_1 end,
case when status = 1 then col_2 end,
case when status = 1 then col_3 end,
case when status = 1 then col_4 end,
case when status = 1 then status end
);
参见 db<>fiddle 中的 运行 示例。
您也可以试试这个,方法是创建一个唯一索引,它是列的连接。
CREATE TABLE DEMO(
COL_1 number(1),
COL_2 number(1),
COL_3 number(1),
COL_4 number(1),
STATUS number(1))
;
CREATE UNIQUE INDEX UQ_INDEX
ON DEMO(
( CASE STATUS WHEN 1 THEN COL_1 || COL_2 ||COL_3 ||COL_4 ||STATUS
ELSE
NULL
END));
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0);
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1);
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0);
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1);
我需要 UNIQUE INDEX CONSTRAINT 用于以下示例:
CREATE TABLE DEMO(
COL_1 number,
COL_2 number,
COL_3 number,
COL_4 number,
STATUS number)
;
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0); --Allow insert
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1); --Allow insert
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0); --Allow insert
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1); --Not allow insert status 1 already exits!
您只需要在 STATUS 列上有一个条件索引。您可以尝试以下查询 -
CREATE UNIQUE INDEX UNQ_IDX_STATUS ON DEMO (CASE WHEN STATUS = 1 THEN STATUS ELSE NULL END);
这将仅在 STATUS 列的值为 1 时应用约束,否则不会影响此列中的其他值。
这是您可以对数据库模型施加的第 12 个 伪 约束(基于 constraint types),不需要使用子句 CONSTRAINT
定义它。
您可以创建部分唯一索引来实施它。例如:
create unique index ix1 on demo (
case when status = 1 then col_1 end,
case when status = 1 then col_2 end,
case when status = 1 then col_3 end,
case when status = 1 then col_4 end,
case when status = 1 then status end
);
参见 db<>fiddle 中的 运行 示例。
您也可以试试这个,方法是创建一个唯一索引,它是列的连接。
CREATE TABLE DEMO(
COL_1 number(1),
COL_2 number(1),
COL_3 number(1),
COL_4 number(1),
STATUS number(1))
;
CREATE UNIQUE INDEX UQ_INDEX
ON DEMO(
( CASE STATUS WHEN 1 THEN COL_1 || COL_2 ||COL_3 ||COL_4 ||STATUS
ELSE
NULL
END));
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0);
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1);
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,0);
Insert into DEMO(COL_1,COL_2,COL_3,COL_4,STATUS) values (1,2,3,4,1);