Oracle:约束检查编号范围冲突
Oracle: constraint check number range collision
有什么方法可以通过约束检查数字范围的空交集吗?示例:
CREATE TABLE "AGE_CATEGORIES" (
"AGE_CATEGORY_ID" CHAR(2 BYTE) NOT NULL PRIMARY KEY,
"NAME" NVARCHAR2(32) NOT NULL,
"RANGE_FROM" NUMBER(*,0) NOT NULL,
"RANGE_TO" NUMBER(*,0) NOT NULL,
CONSTRAINT "UK_AGE_CATEGORIES_NAME" UNIQUE ("NAME"),
CONSTRAINT "CHK_AGE_CATEGORIES_RANGE_COLLISION" CHECK (
???
) ENABLE
);
上面代码中的问号表示如下:
(SELECT COUNT("AGE_CATEGORY_ID")
FROM "AGE_CATEGORIES" AC
WHERE "RANGE_FROM" < AC."RANGE_TO"
AND "RANGE_TO" > AC."RANGE_FROM") = 0
所以我需要检查新的年龄类别是否与存储在这个 table 中的任何其他区间没有交集。可能吗?
可以做到,但涉及创建具有约束的实体化视图 - 请参阅 my blog post。但是,需要仔细考虑这种方法,因为它可能会影响性能。实际上,这种逻辑不是通过约束来检查的,只能通过 API 或触发器中的过程代码来检查。
有什么方法可以通过约束检查数字范围的空交集吗?示例:
CREATE TABLE "AGE_CATEGORIES" (
"AGE_CATEGORY_ID" CHAR(2 BYTE) NOT NULL PRIMARY KEY,
"NAME" NVARCHAR2(32) NOT NULL,
"RANGE_FROM" NUMBER(*,0) NOT NULL,
"RANGE_TO" NUMBER(*,0) NOT NULL,
CONSTRAINT "UK_AGE_CATEGORIES_NAME" UNIQUE ("NAME"),
CONSTRAINT "CHK_AGE_CATEGORIES_RANGE_COLLISION" CHECK (
???
) ENABLE
);
上面代码中的问号表示如下:
(SELECT COUNT("AGE_CATEGORY_ID")
FROM "AGE_CATEGORIES" AC
WHERE "RANGE_FROM" < AC."RANGE_TO"
AND "RANGE_TO" > AC."RANGE_FROM") = 0
所以我需要检查新的年龄类别是否与存储在这个 table 中的任何其他区间没有交集。可能吗?
可以做到,但涉及创建具有约束的实体化视图 - 请参阅 my blog post。但是,需要仔细考虑这种方法,因为它可能会影响性能。实际上,这种逻辑不是通过约束来检查的,只能通过 API 或触发器中的过程代码来检查。