代码之家  ›  专栏  ›  技术社区  ›  Phil

将行插入到只有一个标识列的表中

  •  74
  • Phil  · 技术社区  · 15 年前

    我有一个只有一列的表管理员,adminId是主键。因为商业规则,它必须是这样的。

    我真的不想插入一个伪值只是为了能够插入一个新行。谢谢!

    3 回复  |  直到 12 年前
        1
  •  134
  •   gbn    15 年前

    如果你有一个列是一个身份,就这样做

    INSERT MyTable DEFAULT VALUES;  --allows no column list. The default will be the IDENTITY
    SELECT SCOPE_IDENTITY();
    

    如果你没有身份,那你能设定吗?这是最好的方法。。使用上面的SQL。

    如果不是,则需要插入新行

    INSERT MyTable (admidid)
    OUTPUT INSERTED.admidid --returns result to caller
    SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable
    

    • 在高负载下,最大解决方案可能会失败,出现重复项
    • 范围标识是 事实,不是以前
    • 作用域标识只适用于标识列。同样地,任何白痴都会使用
        2
  •  1
  •   gbn    15 年前

    您需要将IDENTITY_INSERT添加到select语句中:

    SET IDENTITY_INSERT MyTable ON
    
    INSERT INTO MyTable
    (AdminCol)
    
    SELECT AdminColValue
    
     FROM Tableb
    

    完成后,一定要记得

    SET IDENTITY_INSERT MyTable OFF
    

    http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx

        3
  •  0
  •   Tim    15 年前

    @菲尔:你不是说你的表有两(2)列,自动递增的PK列和AdminName列吗?如果AdminName只有一列,那么AdminName就是PK,当然不能自动增加字符串。业务规则是否希望将完全限定的Windows用户名作为主键?这将是可行的,而且是有意义的,因为这样您就不需要在AdminName列上使用备用的唯一索引。

    但如果您的表有两列,而不是一列:

    标识列,指定增量,通常为1,但可以是2、5或10或其他值。若要插入行,只需插入其他列的值,而不对PK列执行任何操作:

    insert into T
    (foo)   -- column(s) list
    values('bar') -- values list
    

    执行插入的存储过程可以使作用域标识成为返回值,或者作用域标识可以作为OUT参数传递回客户端。

    编辑:

    可能,Administrators表包含一组管理员。但是,如果它除了整型主键列之外没有任何列,那么就无法识别管理员;唯一能做的就是将他们彼此区分开来。这一点也不让你走远。但是,如果您的Administrator表具有以下结构之一:

    ID   INTEGER PRIMARY KEY AUTOINCREMENT
    windowsusername   varchar(50)  (unique index)
    

    windowsusername varchar(50) primary key
    

    您可以从其他表中引用管理员表,外键将是有意义的。这正是由一个整数列组成的表所缺少的——含义。

    如果有两列,则可以让存储过程执行以下操作:

    insert into Administrators
    (windowsusername)
    values('mydomain\someusername');
    return SCOPE_IDENTITY();
    

    P、 你提到如果你“没有任何东西要插入”,你就不知道如何“插入一个值”。这里有矛盾。如果没有要插入的内容,为什么要插入?如果你对客户一无所知,为什么还要创建一个新的客户记录呢?不是他们的名字,他们的城市,他们的电话号码,什么都没有?