【问题标题】:Insert rows autoincrement on multiple columns在多列上插入行自动增量
【发布时间】:2012-04-08 04:23:26
【问题描述】:

我有下表

tbl_Users

Id , UserFile, Name  
1,1200,Jan  
2,1201,Piet  
3,1202,Joris  

第一列已经是一个标识列。现在我想将一批从联系人插入到新用户。

INSERT INTO tbl_Users (UserFile,Name)  
    SELECT [AutoIncrement], Name 
    FROM tbl_ContactPerson 
    WHERE (ContactType = 'U') 

我的问题是在[AutoIncrement],我如何在UserFile 列中添加+1,以便我在该列上也有一个自动增量?

我使用的是 SQL Server 2008R2

亲切的问候

【问题讨论】:

    标签: sql sql-server-2008 tsql auto-increment


    【解决方案1】:

    尝试在“批量”选择中使用 ROW_NUMBER() 函数:

    declare @StartValue int
    SELECT @StartValue = MAX(UserFile) FROM tbl_Users 
    
    INSERT INTO tbl_Users (UserFile,Name)   
        SELECT 
            (@StartValue + ROW_NUMBER() over (order by (select 1))) as IncrementNumber, 
            Name  
        FROM 
            tbl_ContactPerson  
        WHERE 
            (ContactType = 'U') 
    

    (order by (select 1)) 是一个小技巧,可以按照 select 返回的顺序对行进行编号。

    您需要使用适当的基数为@StartValue 播种。我已经使用了 UserFile 值的先前最大值。

    编辑 请注意下面 Andriy M 关于原子性的评论。在上面的示例中,您至少需要一个可重复读取事务来确保一致性。

    【讨论】:

    • +1,但我认为您可以通过在INSERT ... SELECT 语句(作为子查询)中直接使用MAX(UserFile) 查询来实现更高程度的原子性。
    • 您提供的解决方案完成了工作,谢谢您
    【解决方案2】:
    DECLARE @seed int
    SELECT @seed = MAX(UserFile) FROM tbl_Users
    
    CREATE TABLE #temp_users
    (
      UserFile identity(@seed + 1, 1)
    , Name varchar(max)
    )
    
    INSERT INTO #temp_users
      SELECT 
        Name 
      FROM 
        tbl_ContactPerson with (nolock)
      WHERE 
        (ContactType = 'U')
    
    INSERT INTO tbl_Users
    (
      UserFile
    , Name
    )
    SELECT
      UserFile
    , Name
    FROM
      #temp_users
    
    DROP TABLE #temp_users
    

    【讨论】:

      【解决方案3】:

      将 UserFile 列也设置为 auto_increment 并在您的选择查询中将其留空

      INSERT INTO tbl_Users (UserFile,Name)  
          SELECT Name FROM tbl_ContactPerson WHERE (ContactType = 'U') 
      

      或者这样做

      INSERT INTO tbl_Users (UserFile,Name)  
          SELECT Max(UserFile) + 1, Name FROM tbl_ContactPerson WHERE (ContactType = 'U') 
      
      猜你喜欢
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2019-02-23
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多