Sql Server 2000数据库,有一张表有几十万条数据,插入、更新都较为频繁,表中有两个列AID、BID,现在要求如果AID值相同则BID不能相同。如记录某地区的所有高校,如果是同一个高校(AID),则学生号(BID)不能重复;求教:
1、该如何实现?约束?触发器?
2、约束or触发器对性能是否有影响?本来是在程序中进行校验的,但有发生校验异常,AID和BID都相同的值插入数据库。即使只是几万条数据中出现一条这样的错误,也是令人难以忍受的错啊!
诚心求教各位!数据库sql约束;触发器

解决方案 »

  1.   

    我说的是或嘛。。alter table tbName
    add constraint UQ_约束名 unique (AID,BID) 
      

  2.   

    这个。。只能改,sqlserver的唯一键不能忽略创建
      

  3.   


    嗯,其实我很崩溃的发现我的描述有大问题!!!
    汗!其实是因为有第三个字段IsTrue,当IsTrue为真时是可以重复的
      

  4.   

    那这个不好弄啊,应该没有这样的约束条件以前看到过关于约束的,可以写一个标量函数返回true或false,内容是判断重复条件
    然后将这个函数用到check约束中,不过这样检测性能应该不高啊
    何况你更新插入还很频繁
      

  5.   

    对,就是担心性能的问题。
    所以完整的问题是表中四个列,KeyId(主键)、AID、BID、IsTrue,当IsTrue=1时,AID与BID不能有重复值,当IsTrue=0时,则该行数据无需校验
      

  6.   


    这个容易,AID、BID、IsTrue联合唯一,IsTrue的意义反转为IsFalse。AID、BID需要唯一时IsFalse=0;AID、BID不需要唯一时IsFalse可以给一个随机非0值,也可以用KeyId的HashValue。
      

  7.   

    唯一筛选索引
    create unique nonclustered index IX_TB_AID_BID on TB(AID,BID) where IsTrue=1
    和10楼有相同的逻辑问题,可以保证IsTrue=1的AID/BID不重复,但不能保证IsTrue=0的AID/BID和IsTrue=1的不重复。是否符合要求,自己权衡。
      

  8.   

    筛选索引在性能上有帮助,但是在逻辑判断的时候可能没什么明显的效果。如果你觉得约束触发器不好实现,建议你在插入的时候直接在语句中判断。这样性能、逻辑都能保证。何况也不是什么复杂的逻辑。约束那些只是SQLServer帮你做了而已,你自己也是可以做的。