CREATE TABLE T1( ID VARCHAR2(10) PRIMARY KEY, NAME VARCHAR2(100), SC VARCHAR2(10) NOT NULL CONSTRAINT CK_SC CHECK (SC = 0 OR SC =1), CONSTRAINT UNI_NAME_SC UNIQUE (NAME, SC) ); --测试: INSERT INTO T1 VALUES ('1','名字1','1'); --报错: 违反约束CK_SC INSERT INTO T1 VALUES('2','名字2','2'); --报错:违反约束UNI_NAME_SC INSERT INTO T1 VALUES('3','名字1','1'); 有几个方式可以实现楼主的要求: 1、唯一键 unique 约束,可以设置sc和name的唯一性,这样就能够保证在1或者0的时候,name总是唯一的,最保险。 2、写一个触发器trigger,但是要承担触发器偶尔会失效的风险。 3、写一个check 约束,这个我没有考虑出来怎么实现,作为简单的判断长度length(name)>=0可以实现,但是这个带逻辑的不晓得咋个写法....
CONSTRAINT CK_SC CHECK (SC = 0 OR SC =1), 只是在取值上约束了,我的意思是 在SC 为1 时 NAME是唯一的,不能重 如 ID NAME SC 1 A 1 2 B 1 如插入 3 A 1 则不让插入,因为 SC 为1 时 A 已经有了插入 3 A 0 则让插入
再插入 3 A 0 则也让插入 ,如按二楼朋友的方法则在 SC 为 0时不能插入NAME相同的多条
--虚拟列不会占用存储空间,你也可以直接建立一个unique 函数索引来防止这种情况发生. create table t ( id number primary key , name varchar2(20) , sc varchar2(1) , vcol as (name||decode(sc,0,id)) unique);Table created.SQL> insert into t (id,name,sc) values(1,'name','1') ;1 row created.SQL> insert into t (id,name,sc) values(2,'name','1') ; insert into t (id,name,sc) values(2,'name','1') * ERROR at line 1: ORA-00001: unique constraint (HR.SYS_C0016210) violated SQL> insert into t (id,name,sc) values(2,'name','0') ;1 row created.SQL> insert into t (id,name,sc) values(3,'name','0') ;1 row created.SQL> commit ;Commit complete.select * from t ; ID NAME S VCOL ---------- -------------------- - -------------------- 1 name 1 name 2 name 0 name2 3 name 0 name3
--两种方法原理上市相同的,不过只是第一种方法会有一个附加的列出现. create table t ( id number primary key , name varchar2(20) , sc varchar2(1) ) ;Table created.SQL> create unique index idx_ud_t_fun_name_sc on t (name||decode(sc,0,id)) ;Index created.SQL> insert into t (id,name,sc) values(1,'name','1') ;1 row created.SQL> insert into t (id,name,sc) values(2,'name','1') ; insert into t (id,name,sc) values(2,'name','1') * ERROR at line 1: ORA-00001: unique constraint (HR.IDX_UD_T_FUN_NAME_SC) violatedSQL> insert into t (id,name,sc) values(2,'name','0') ;1 row created.SQL> insert into t (id,name,sc) values(3,'name','0') ;1 row created.SQL> commit ;Commit complete. SQL> select * from t ; ID NAME S ---------- -------------------- - 1 name 1 2 name 0 3 name 0
不好意思,如果你的sc有可能是0|1 以外的值,需要将 decode(sc,0,id) 修改为 decode(sc,'0',id||'')不过这样的话逻辑就变了,除了0可以重复以外,其他的都不可以重复,比如说 name sc dex 1 dex d dex 2这其中的任意两行绝对不会同时出现在表中
CREATE TABLE T1(
ID VARCHAR2(10) PRIMARY KEY,
NAME VARCHAR2(100),
SC VARCHAR2(10) NOT NULL
CONSTRAINT CK_SC CHECK (SC = 0 OR SC =1),
CONSTRAINT UNI_NAME_SC UNIQUE (NAME, SC)
);
--测试:
INSERT INTO T1 VALUES ('1','名字1','1');
--报错: 违反约束CK_SC
INSERT INTO T1 VALUES('2','名字2','2');
--报错:违反约束UNI_NAME_SC
INSERT INTO T1 VALUES('3','名字1','1');
有几个方式可以实现楼主的要求:
1、唯一键 unique 约束,可以设置sc和name的唯一性,这样就能够保证在1或者0的时候,name总是唯一的,最保险。
2、写一个触发器trigger,但是要承担触发器偶尔会失效的风险。
3、写一个check 约束,这个我没有考虑出来怎么实现,作为简单的判断长度length(name)>=0可以实现,但是这个带逻辑的不晓得咋个写法....
只是在取值上约束了,我的意思是 在SC 为1 时 NAME是唯一的,不能重
如
ID NAME SC
1 A 1
2 B 1
如插入
3 A 1 则不让插入,因为 SC 为1 时 A 已经有了插入
3 A 0 则让插入
3 A 0 则也让插入 ,如按二楼朋友的方法则在 SC 为 0时不能插入NAME相同的多条
--虚拟列不会占用存储空间,你也可以直接建立一个unique 函数索引来防止这种情况发生.
create table t (
id number primary key ,
name varchar2(20) ,
sc varchar2(1) ,
vcol as (name||decode(sc,0,id)) unique);Table created.SQL> insert into t (id,name,sc) values(1,'name','1') ;1 row created.SQL> insert into t (id,name,sc) values(2,'name','1') ;
insert into t (id,name,sc) values(2,'name','1')
*
ERROR at line 1:
ORA-00001: unique constraint (HR.SYS_C0016210) violated
SQL> insert into t (id,name,sc) values(2,'name','0') ;1 row created.SQL> insert into t (id,name,sc) values(3,'name','0') ;1 row created.SQL> commit ;Commit complete.select * from t ; ID NAME S VCOL
---------- -------------------- - --------------------
1 name 1 name
2 name 0 name2
3 name 0 name3
--两种方法原理上市相同的,不过只是第一种方法会有一个附加的列出现.
create table t (
id number primary key ,
name varchar2(20) ,
sc varchar2(1) ) ;Table created.SQL> create unique index idx_ud_t_fun_name_sc on t (name||decode(sc,0,id)) ;Index created.SQL> insert into t (id,name,sc) values(1,'name','1') ;1 row created.SQL> insert into t (id,name,sc) values(2,'name','1') ;
insert into t (id,name,sc) values(2,'name','1')
*
ERROR at line 1:
ORA-00001: unique constraint (HR.IDX_UD_T_FUN_NAME_SC) violatedSQL> insert into t (id,name,sc) values(2,'name','0') ;1 row created.SQL> insert into t (id,name,sc) values(3,'name','0') ;1 row created.SQL> commit ;Commit complete.
SQL> select * from t ; ID NAME S
---------- -------------------- -
1 name 1
2 name 0
3 name 0
decode(sc,0,id)
修改为
decode(sc,'0',id||'')不过这样的话逻辑就变了,除了0可以重复以外,其他的都不可以重复,比如说
name sc
dex 1
dex d
dex 2这其中的任意两行绝对不会同时出现在表中