各位大虾,小弟有一个问题,多人操作一张表,向这个表里插入记录,每次插入记录的时候,都要先给出这个表的最大值,如何才能保证插入不重复阿!

解决方案 »

  1.   

    就是并发性问题
    引用邹建的
    -- 测试数据
    IF OBJECT_ID('T1') IS NOT NULL
    DROP TABLE T1
    IF OBJECT_ID('T2') IS NOT NULL
    DROP TABLE T2
    IF OBJECT_ID('T3') IS NOT NULL
    DROP TABLE T3CREATE TABLE T1(
    id int IDENTITY, col int)
    CREATE TABLE T2(
    id int IDENTITY, col int)
    CREATE TABLE T3(
    t1_id int, t2_id int)
    GO-- 在t2上写个触发器, 传出数据
    CREATE TRIGGER tr_T2_insert ON T2
    FOR INSERT
    AS
    IF OBJECT_ID('tempdb..#') IS NOT NULL
    INSERT # SELECT id FROM inserted
    GO-- 追加数据处理
    DECLARE @t1_id int
    IF OBJECT_ID('tempdb..#') IS NOT NULL
    DROP TABLE #
    CREATE TABLE #(id int)INSERT T1 VALUES(1)
    SET @t1_id = SCOPE_IDENTITY()INSERT T2(col) VALUES(11)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(21)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(31)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(41)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(51)INSERT T3 SELECT @t1_id, id FROM #
    DROP TABLE #-- 显示结果
    SELECT *
    FROM T2, T3
    WHERE T2.id = T3.t2_id
    AND T3.t1_id = @t1_id
    GO-- 删除测试
    --DROP TABLE T1, T2, T3
      

  2.   

    -- 要测试并发带来的影响, 则开两个查询窗口, 一个执行上面的, 执行开始后(注意不是执行完成后), 在另一个查询窗口执行下面的-- 追加数据处理
    DECLARE @t1_id int
    IF OBJECT_ID('tempdb..#') IS NOT NULL
    DROP TABLE #
    CREATE TABLE #(id int)INSERT T1 VALUES(1)
    SET @t1_id = SCOPE_IDENTITY()INSERT T2(col) VALUES(12)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(22)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(32)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(42)
    WAITFOR DELAY '00:00:02'
    INSERT T2(col) VALUES(52)INSERT T3 SELECT @t1_id, id FROM #
    DROP TABLE #-- 显示结果
    SELECT *
    FROM T2, T3
    WHERE T2.id = T3.t2_id
    AND T3.t1_id = @t1_id
    GO
      

  3.   

    插入的时候用这个方法取最大值,不要用MAX(ID)取最大值SELECT @MAXID = SCOPE_IDENTITY()