Sql 表中有多个列的唯一值约束,而不是Oracle中的组合
在oracle中,有没有一种方法可以强制两列之间的唯一性 它不是两列组合之间的唯一性,而是两列之间跨表的值 参考资料: 不应允许的示例数据:Sql 表中有多个列的唯一值约束,而不是Oracle中的组合,sql,oracle,multiple-columns,unique-constraint,Sql,Oracle,Multiple Columns,Unique Constraint,在oracle中,有没有一种方法可以强制两列之间的唯一性 它不是两列组合之间的唯一性,而是两列之间跨表的值 参考资料: 不应允许的示例数据: id | phone1 | phone2 1 | 111 | 111 id | phone1 | phone2 1 | 111 | NULL 2 | 111 | NULL id | phone1 | phone2 1 | 111 | NULL 2 | NULL | 111 我的Oracle版本: Orac
id | phone1 | phone2
1 | 111 | 111
id | phone1 | phone2
1 | 111 | NULL
2 | 111 | NULL
id | phone1 | phone2
1 | 111 | NULL
2 | NULL | 111
我的Oracle版本:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
我将结合检查约束和函数上的唯一索引来解决它:
CREATE TABLE t(id NUMBER, phone1 NUMBER, phone2 NUMBER);
ALTER TABLE t ADD CONSTRAINT c1 CHECK (phone1 <> phone2);
CREATE UNIQUE INDEX u ON t(COALESCE(phone1, phone2));
案例2也起作用:
INSERT INTO t VALUES (1, 111, NULL);
INSERT INTO t VALUES (2, 111, NULL);
ORA-00001: unique constraint (U) violated
案例3,以及:
INSERT INTO t VALUES (1, 111, NULL);
INSERT INTO t VALUES (2, NULL, 111);
ORA-00001: unique constraint (WFL.U) violated
但是,这不受保护:
INSERT INTO t VALUES (1, 111, 222);
INSERT INTO t VALUES (2, 222, 111);
我将结合检查约束和函数上的唯一索引来解决它:
CREATE TABLE t(id NUMBER, phone1 NUMBER, phone2 NUMBER);
ALTER TABLE t ADD CONSTRAINT c1 CHECK (phone1 <> phone2);
CREATE UNIQUE INDEX u ON t(COALESCE(phone1, phone2));
案例2也起作用:
INSERT INTO t VALUES (1, 111, NULL);
INSERT INTO t VALUES (2, 111, NULL);
ORA-00001: unique constraint (U) violated
案例3,以及:
INSERT INTO t VALUES (1, 111, NULL);
INSERT INTO t VALUES (2, NULL, 111);
ORA-00001: unique constraint (WFL.U) violated
但是,这不受保护:
INSERT INTO t VALUES (1, 111, 222);
INSERT INTO t VALUES (2, 222, 111);
我将使用检查约束来确保每行的唯一性,并为跨行的唯一性使用唯一索引:
create table mytable (
id int,
phone1 int,
phone2 int,
check (phone1 <> phone2)
);
create unique index myidx on mytable(
greatest(coalesce(phone1, phone2), coalesce(phone2, phone1)),
least(coalesce(phone1, phone2), coalesce(phone2, phone1))
);
我将使用检查约束来确保每行的唯一性,并为跨行的唯一性使用唯一索引:
create table mytable (
id int,
phone1 int,
phone2 int,
check (phone1 <> phone2)
);
create unique index myidx on mytable(
greatest(coalesce(phone1, phone2), coalesce(phone2, phone1)),
least(coalesce(phone1, phone2), coalesce(phone2, phone1))
);
请提供示例数据和示例,说明什么是允许的,什么是不允许的。我添加了引用,其中包含我要查找的示例。因此,phone1不能与phone2相同,并且任何值在两列中都应该是唯一的?这是正确的。请查看以上第2和第3个案例以了解更多信息。总之,这两个字段phone1和phone2的值在表中的两列值中应该是唯一的。请提供示例数据以及什么是不允许的示例。我添加了引用,其中包含我要查找的示例。因此,phone1不能与phone2相同,任何值在两列中都应该是唯一的?这是正确的。请查看以上第2和第3个案例以了解更多信息。总之,这两个字段phone1和phone2的值在整个表的两列值中应该是唯一的。您的最大/最小构造基本上是对元组进行排序,对吗?@wolφi:是的,的确如此。这是为了防止镜像元组成为我回答中的最后一个用例。你有什么手机??;-是的,当然它对字母数字有用……你最大/最小的构造基本上就是对元组排序,对吗?@wolφi:是的,的确如此。这是为了防止镜像元组成为我回答中的最后一个用例。你有什么手机??;-是的,当然可以用字母数字…明白了。但最后一个很重要。好的,那就是GMB的解决方案+1。明白了。但最后一个很重要。好的,这是GMB解决方案的+1。
begin
insert into mytable values(1, 111, null);
insert into mytable values(1, null, 111);
end;
/
ORA-00001: unique constraint (FIDDLE_SMBYKTEIHNNVOHKZSCYK.MYIDX) violated
ORA-06512: at line 3
begin
insert into mytable values(1, 111, 222);
insert into mytable values(1, 222, 111);
end;
/
ORA-00001: unique constraint (FIDDLE_SMBYKTEIHNNVOHKZSCYK.MYIDX) violated
ORA-06512: at line 3