是有并发性吧!把重复的删掉!给recordid加主键就绝对不会发生了!!!!!!!!

解决方案 »

  1.   

    有一个可能,比如input表生成一个recordid为10的记录,这个时候程序把该记录存放到日表中。但存放完毕以后该记录除recordid字段外其他字段被修改,包括日期,但是程序在导入数据的时候是按日期区分的,所以它认为是新记录,然后又给导过去了。
    这个时候,就会在日表出现recordid重复的问题了。
      

  2.   

    DJMPH(冷开水)分析的有道理
    你对input表update 日期的时候,用触发器直接修改相应的日表记录
    日表的recordid加主键后,重复记录就不会被插入了
      

  3.   

    input表导完数据后,对INPUT表将如何处理:
    1。数据删除。用DELETE;此方法不会重复;
    2。数据删除。用TRUNCATE;这种删除方法再下次导数时会产生重复;
    3。不做处理。下次导数时也会重复。
      

  4.   

    现在大家的方法有两个: 
     happydreamer(小黑) 的:采用触发器update,同时日表recordid加主键或唯一索引。同时建议在导数据的时候使用where recordid not in (select recordid from 日表)等判断。
     tj_dns(愉快的登山者) 的:要不你就干脆导入以后就delete导入过的数据,以后修改就到日表里改。这样就不会重复了。
      

  5.   

    感谢各位的热心相助!!
    问题并没有解决,这可能跟我描述得过于简单有关.
    现详述之:
    有个程序A负责将文件导入数据库的input中,同时有另外一个程序B实时地讲input表中的记录按日期字段分别将记录导入相应的日表中,并且删除input中已经分到日表中的记录.日表中的recordid字段是由input表中的recordid中的数据传进来的,主要用于界定删除input表中已分到日表的记录的范围.因此不能将日表的recordid加任何约束.现在问题是,在处理一段时间后,
    发现日表与日表之间存在recordid相同,但其他字段数据不相同的记录.请问为何???先谢了!!!
      

  6.   

    我看啦,这个问题可能出在很多地方:
    首先,B程序出现问题的可能比较大。因为他是负责数据的‘分发’的,要是他在分发数据的时候把recordid分配错误就会造成recordid重复。
    还有就是日表之间的数据应该是独立的,所以应该保证日表的数据不能被其他程序所修改到。特别是recordid字段。
    最后应该保证的是不要对input表的recordid字段的当前号做任何处理。否则recordid的唯一性就不能得到保证。因为你导出后的数据是被删除了的。
      

  7.   

    根据本人的猜测。应该是事务和判断的问题。假设两个任务分别命名为A,B。A负责INPUT,B负责日表。
    则可以猜测的过程大概如下:当B读取INPUT表的数据的时候,并插入到日表。但是这个时候可能没有对INPUT的表进行锁定。然后这个时候B又读取INPUT表的其它字段。这里可能存在INPUT表又插入一条数据的可能性。而B这个时候获取其他的数据的过程可能有问题,例如总是取最大的ID的有关数据。B的插入需要的资料(可能已经错误了),然后又要删除A中的记录。但是这个时候可能删除的就是另外一个记录。所以错误发生了。具体不知道程序如何,但是可以使用适当的LOCK,和对具体ID的追踪来解决问题。以上都是一个假设.
      

  8.   

    如果程序是你们自己做就有办法:1)input中不要删除记录,而是做处理标记,以recordid为主键避免程序A输入重复记录。2)B程序的操作作为完整的一个事务进行(最好用存储过程做)
      

  9.   

    到底是什么意外很难通过这样的叙述了解清楚。如果假设了“日表中的数据不能加约束”同时又假设他是一致的(这是变本加厉地走向混乱),当意外出现时,某些关联语句往往预期的不同,关联input表和日表就不会得到与input表同样多的记录,而是多倍的数据。
      

  10.   

    换句话说,当“日表”比input复杂时,不是“不能加约束”而是应该“非常精巧仔细加上更加细致的约束”。
      

  11.   

    纠正:
    日表的recordid加上唯一约束.不过问题还是出现!!!!
      

  12.   

    我在想,会不会是input表中recordid字段的问题.因为有可能某一次的数据导入到input表时,使用了原来被删除了的标识号.我的根据是来自于SQLServer帮助里的一段话----"如果表的标识符列经常执行删除操作,标识值间可能会产生断缺,删除的标识值不能再使用。要避免出现这类断缺,请勿使用 IDENTITY 属性。而应在插入行时,以标识符列中现有的数值为基础创建确定新标识值的触发器"大家认为呢?????
      

  13.   

    recordid字段本身应该不会有问题,
    identity本身是不会重复的,只会往前增长。
    如果表做了删除操作的话,identity字段会出现不连续的。可以try如果input往日表中做了插入后,不删除input表的纪录,
    看是否会出现重复,如果不重复的话,就不是identity的问题,
    而是你插入到日表的问题。
    会不会同一个recordid插入到2个日表中呢?
    由于修改的出现?