oracle唯一约束

有重复值还可以唯一约束???都是空值就可以唯一约束??
-----有重复值不能建唯一约束
-----都是空值是可以唯一约束的。

--------------------------------------------------------------------------
--1.如果seq_id预先有重复值(非空的值有重复),是不能加唯一约束的
--2.如果seq_id预先有多个空值(全部记录都是空值也能加),但非空的值都不重复,能加唯一约束
--3.先加唯一约束,再插入seq_id为空的记录,这也是可以的

--如果seq_id不插入空值,但无重复 ,有记录之后再加唯一约束
drop table t_imp_test;
create table t_imp_test(
  seq_id number(10),
  name varchar2(200),
  tel varchar2(200),
  dw  varchar2(200)
);

/*
--3.先加唯一约束,再插入seq_id为空的记录,这也是可以的

alter table t_imp_test add constraint const_t_imp_test_seq_id unique(seq_id);--先加约束

insert into t_imp_test(name,tel,dw)---------------------------------------------执行可以通过
select 'aa' name,'13780001256' tel,'易方达基金公司' dw from dual
union all select 'bb' name,'' tel,'南方基金公司' dw from dual
union all select 'cc' name,'13780001248' tel,'博时基金公司' dw from dual
union all select 'dd' name,'13780008888' tel,'易方达基金公司' dw from dual
;

select * from t_imp_test;

*/

/*
--1.如果seq_id预先有重复值(非空的值有重复),是不能加唯一约束的
insert into t_imp_test(seq_id,name,tel,dw)
select 111 seq_id,'aa' name,'13780001256' tel,'易方达基金公司' dw from dual
union all select 111 seq_id,'bb' name,'' tel,'南方基金公司' dw from dual
union all select 222 seq_id,'cc' name,'13780001248' tel,'博时基金公司' dw from dual
union all select 111 seq_id,'dd' name,'13780008888' tel,'易方达基金公司' dw from dual
;

select * from t_imp_test;

alter table t_imp_test add constraint const_t_imp_test_seq_id unique(seq_id);---执行报错
*/

/*
--2.如果seq_id预先有多个空值,但非空的值都不重复,能加唯一约束
insert into t_imp_test(seq_id,name,tel,dw)
select 222 seq_id,'aa' name,'13780001256' tel,'易方达基金公司' dw from dual
union all select null seq_id,'bb' name,'' tel,'南方基金公司' dw from dual
union all select null seq_id,'cc' name,'13780001248' tel,'博时基金公司' dw from dual
union all select null seq_id,'dd' name,'13780008888' tel,'易方达基金公司' dw from dual
;

select * from t_imp_test;

alter table t_imp_test add constraint const_t_imp_test_seq_id unique(seq_id);---执行通过

insert into t_imp_test(seq_id,name,tel,dw)
select null seq_id,'ee' name,'' tel,'南方基金公司' dw from dual
union all select null seq_id,'ff' name,'13780001248' tel,'博时基金公司' dw from dual---seq_id为空也执行通过
;
*/

猜你喜欢

转载自www.cnblogs.com/jiangqingfeng/p/9155971.html