求建表时的约束语法
我有表 T1
ID  CHAR(10)
NAME  CHAR(10)SC   CHAR(10)
取值为 0 或 1 取1时为无效标志要求是 在SC 为1 时 NAME是唯一的,不能重

解决方案 »

  1.   


    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可以实现,但是这个带逻辑的不晓得咋个写法....
      

  2.   

    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.   

    再插入
    3 A 0 则也让插入 ,如按二楼朋友的方法则在 SC 为 0时不能插入NAME相同的多条
      

  4.   


    --虚拟列不会占用存储空间,你也可以直接建立一个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
      

  5.   


    --两种方法原理上市相同的,不过只是第一种方法会有一个附加的列出现.
    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
      

  6.   

    不好意思,如果你的sc有可能是0|1 以外的值,需要将
    decode(sc,0,id)
    修改为
    decode(sc,'0',id||'')不过这样的话逻辑就变了,除了0可以重复以外,其他的都不可以重复,比如说
    name  sc 
    dex   1
    dex   d
    dex   2这其中的任意两行绝对不会同时出现在表中