Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表中有多个列的唯一值约束,而不是Oracle中的组合_Sql_Oracle_Multiple Columns_Unique Constraint - Fatal编程技术网

Sql 表中有多个列的唯一值约束,而不是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

在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版本:

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