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_Constraints_Unique Constraint_Composite Key - Fatal编程技术网

Sql 在Oracle中,如何为列和固定值的组合提供唯一约束?

Sql 在Oracle中,如何为列和固定值的组合提供唯一约束?,sql,oracle,constraints,unique-constraint,composite-key,Sql,Oracle,Constraints,Unique Constraint,Composite Key,我有一个表,有3列:a(数字)、B(数字)和C(布尔值) 我需要创建一个规则,防止创建列a和B以及C等于true的记录。比如说 这是允许的: A B C 1 2 true 1 2 false 1 2 false 但这不是: A B C 1 2 true 1 2 true 1 2 false 使用唯一的基于函数的索引,该索引仅处理具有C='true'的行 您必须以某种方式组合列A和B——我使用字符串连接 create unique index uq_true o

我有一个表,有3列:a(数字)、B(数字)和C(布尔值)

我需要创建一个规则,防止创建列a和B以及C等于true的记录。比如说

这是允许的:

A  B  C
1  2  true
1  2  false
1  2  false
但这不是:

A  B  C
1  2  true
1  2  true
1  2  false
使用唯一的基于函数的索引,该索引仅处理具有
C='true'
的行

您必须以某种方式组合列
A
B
——我使用字符串连接

create unique index uq_true on test(case when c = 'true' then a||'.'||b end);

insert into test(a,b,c) values (1,2,'true');
insert into test(a,b,c) values (1,2,'false');
insert into test(a,b,c) values (1,2,'false');
insert into test(a,b,c) values (1,2,'true');
ORA-00001: unique constraint (DWH.UQ_TRUE) violated

select * from test;

         A          B C        
---------- ---------- ----------
         1          2 true       
         1          2 false      
         1          2 false  

MarmiteBomber方法的细微变化,以避免连接值(这可能导致与非整数值的意外冲突):


非整数(如果可能存在)可能是一个问题的快速示例:

create unique index uq_true on test(case when c = 'true' then a||'.'||b end);

insert into test(a,b,c) values (1.1, 2,'true');

1 row inserted.

insert into test(a,b,c) values (1, 1.2,'true');

ORA-00001: unique constraint (MY_SCHEMA.UQ_TRUE) violated

select * from test;

         A          B C    
---------- ---------- -----
       1.1          2 true 
。。。因为对于
'1.1'| | | | 2'
'1'| | | 1.2'
解析为同一字符串,
'1.1.2'


当组合字符串值而不是数字时,这也可能是一个问题。在任何一种情况下,您都可以通过使用分隔符来避免它,该分隔符不能存在于任何一个值中;字符串更难处理,但对于数字,除了句点(或逗号)以外的任何标点符号都可能会处理-除非有人对
nls\u数字字符设置了奇怪的设置

使用三列创建主键无法解决问题?@Lawrence,创建一个包含三列的主键不允许我创建第一个引用的示例那样的记录。我认为Oracle不允许您在表中创建布尔值。但是您可以尝试:将c=true编码为c=0,将c=false编码为c0。插入到c 0中表示true,sequence.nextval表示false。我正准备编写一些东西,使用虚拟列存储true或NULL,并将索引建立在该列的基础上,但这更干净、更整洁。美好的请原谅,C列不是布尔值,而是一个数字。但是这个命令对我有效。谢谢。@MarmiteBomber-您的版本仍然可以使用整数,这就是问题*8-中显示的全部内容。)
create unique index uq_true on test(case when c = 'true' then a||'.'||b end);

insert into test(a,b,c) values (1.1, 2,'true');

1 row inserted.

insert into test(a,b,c) values (1, 1.2,'true');

ORA-00001: unique constraint (MY_SCHEMA.UQ_TRUE) violated

select * from test;

         A          B C    
---------- ---------- -----
       1.1          2 true