2009-06-26 112 views
328

我需要将表的主键更改为标识列,并且表中已经有许多行。将标识添加到现有列中

我已经有一个脚本来清理ID以确保它们从1开始连续,在我的测试数据库上正常工作。

什么是SQL命令来改变列有一个标识属性?

回答

359

你不能改变现有列的身份。

你有2种选择,

  1. 创建标识新表&删除现有的表

  2. 创建标识的新列&删除现有列

方法1.(新表)在这里你可以保留存在g新创建的标识列上的数据值。

CREATE TABLE dbo.Tmp_Names 
    (
     Id int NOT NULL 
      IDENTITY(1, 1), 
     Name varchar(50) NULL 
    ) 
ON [PRIMARY] 
go 

SET IDENTITY_INSERT dbo.Tmp_Names ON 
go 

IF EXISTS (SELECT * 
      FROM dbo.Names) 
    INSERT INTO dbo.Tmp_Names (Id, Name) 
      SELECT Id, 
        Name 
      FROM dbo.Names TABLOCKX 
go 

SET IDENTITY_INSERT dbo.Tmp_Names OFF 
go 

DROP TABLE dbo.Names 
go 

Exec sp_rename 'Tmp_Names', 'Names' 

方法2(新列)您不能保留在新创建的标识列现有的数据值,标识列将举行数的序列。

Alter Table Names 
Add Id_new Int Identity(1, 1) 
Go 

Alter Table Names Drop Column ID 
Go 

Exec sp_rename 'Names.Id_new', 'ID', 'Column' 

请参见下面的Microsoft SQL Server论坛发帖更多细节:

How to alter column to identity(1,1)

57

您无法将列更改为IDENTITY列。你需要做的是创建一个新的列,该列从开始就定义为IDENTITY,然后删除旧列,并将新列重命名为旧名称。

ALTER TABLE (yourTable) ADD NewColumn INT IDENTITY(1,1) 

ALTER TABLE (yourTable) DROP COLUMN OldColumnName 

EXEC sp_rename 'yourTable.NewColumn', 'OldColumnName', 'COLUMN' 

马克

+8

如果此列约束 – 2013-05-28 13:45:11

+0

无论是参数\ @objname不明确或声称\ @objtype(列)错了,它不工作。 – 2013-10-02 08:50:02

+0

@ JennyO'Reilly:把它放在一个单独的问题中,**向我们展示您正在使用的完整命令! – 2013-10-02 08:51:17

0

我不相信你可以改变现有的列是使用T-SQL标识列。但是,您可以通过企业管理器设计视图来完成。

或者,您可以创建一个新行作为标识列,删除旧列,然后重命名新列。

ALTER TABLE FooTable 
ADD BarColumn INT IDENTITY(1, 1) 
       NOT NULL 
       PRIMARY KEY CLUSTERED 
2

可悲的是, IDENTITY属性属于表格而不是列。

更简单的方法是做它的图形用户界面,但如果这是不是一种选择,你可以去周围复制数据,删除列的很长的路要走与身份,重新添加它,并把数据回来。

请参阅here了解详情。

3

通过设计有可开启或关闭身份特征现存列没有简单的方法。唯一干净的方法是创建一个新列并将其设置为标识列或创建一个新表并迁移您的数据。

如果我们使用SQL Server Management Studio摆脱列“id”上的标识值,将创建一个新的临时表,将数据移动到临时表,旧表被删除,新表被删除重命名。

使用Management Studio进行更改,然后右键单击设计器并选择“生成更改脚本”。

您会看到这是SQL服务器在后台执行的操作。

3

您不能这样做,您需要添加另一列,删除原始列并重命名新列或创建新表,然后复制数据并删除旧表,然后重命名新表到旧表

如果您在设计器中使用SSMS并将标识属性设置为ON,这里是SQL Server在幕后执行的操作。所以,如果你有一个表名为[用户]这是,如果你做用户名和身份

BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 

GO 

GO 
CREATE TABLE dbo.Tmp_User 
    (
    UserID int NOT NULL IDENTITY (1, 1), 
    LastName varchar(50) NOT NULL, 
    FirstName varchar(50) NOT NULL, 
    MiddleInitial char(1) NULL 

    ) ON [PRIMARY] 
GO 

SET IDENTITY_INSERT dbo.Tmp_User ON 
GO 
IF EXISTS(SELECT * FROM dbo.[User]) 
EXEC('INSERT INTO dbo.Tmp_User (UserID, LastName, FirstName, MiddleInitial) 
    SELECT UserID, LastName, FirstName, MiddleInitialFROM dbo.[User] TABLOCKX') 
GO 
SET IDENTITY_INSERT dbo.Tmp_User OFF 
GO 

GO 
DROP TABLE dbo.[User] 
GO 
EXECUTE sp_rename N'dbo.Tmp_User', N'User', 'OBJECT' 
GO 
ALTER TABLE dbo.[User] ADD CONSTRAINT 
    PK_User PRIMARY KEY CLUSTERED 
    (
    UserID 
    ) ON [PRIMARY] 

GO 
COMMIT 

说了这么多有破解的系统表通过设置按位值来完成它的方式,但是这是发生了什么不支持,我不会这样做

161

在SQL 2005及以上,有一个技巧来解决这个问题,而不改变表的数据页。这对于触摸每个数据页面的大型表格可能需要数分钟或数小时很重要。即使身份列是主键,属于聚集索引或非聚集索引的一部分,或者其他陷入可能导致更简单的“添加/删除/重命名列”解决方案的技巧,该技巧也可以工作。

这里的技巧:您可以使用SQL Server的ALTER TABLE...SWITCH语句更改表的模式而不更改数据,这意味着您可以使用具有相同表模式(但没有IDENTITY列)的IDENTITY替换表。同样的技巧可以将IDENTITY添加到现有列。

通常,ALTER TABLE...SWITCH用于有效替换分区表中的完整分区和新的空分区。但是它也可以在非分区表中使用。

我已经使用这个技巧在5秒钟内将IDENTITY中的25亿行表中的一列转换为非IDENTITY(为了运行查询计划工作得更好的多小时查询对于非IDENTITY列),然后在不到5秒内再次恢复IDENTITY设置。

下面是它如何工作的代码示例。

CREATE TABLE Test 
(
    id int identity(1,1), 
    somecolumn varchar(10) 
); 

INSERT INTO Test VALUES ('Hello'); 
INSERT INTO Test VALUES ('World'); 

-- copy the table. use same schema, but no identity 
CREATE TABLE Test2 
(
    id int NOT NULL, 
    somecolumn varchar(10) 
); 

ALTER TABLE Test SWITCH TO Test2; 

-- drop the original (now empty) table 
DROP TABLE Test; 

-- rename new table to old table's name 
EXEC sp_rename 'Test2','Test'; 

-- update the identity seed 
DBCC CHECKIDENT('Test'); 

-- see same records 
SELECT * FROM Test; 

这显然比其他答案中的解决方案涉及更多,但如果您的桌子很大,这可能是一个真正的救命。有一些注意事项:

  • 你需要先删除foriegn密钥,然后再进行切换并恢复它们。
  • 同为WITH SCHEMABINDING功能,视图等
  • 新表的索引需要精确匹配(相同的列,相同的顺序等)
  • 新老表需要在同一个文件组。
  • 只适用于SQL Server 2005或更高版本
  • 我以前认为这个技巧只适用于SQL Server的企业版或开发者版(因为分区仅在企业版和开发者版中受支持),但是Mason G. Zhwiti in他的评论如下所述,它也适用于SQL标准版。我认为这意味着企业或开发人员的限制不适用于ALTER TABLE ... SWITCH。

有一个很好的article on TechNet详细说明了上述要求。

13

这里有描述冷静的解决方案: SQL SERVER – Add or Remove Identity Property on Column

在手动总之编辑您的表中的SQL Manager中,切换身份,不保存更改,只显示其将为变化而创建的脚本,将它复制并在以后使用它。

这是非常节省时间的,因为它(脚本)包含所有与您更改的表相关的外键,索引等。手动写这个...上帝保佑。

1

如果原始海报实际上是想为表设置现有列为PRIMARY KEY,实际上并不需要该列为IDENTITY列(两种不同的东西),那么可以通过t-SQL与:

ALTER TABLE [YourTableName] 
ADD CONSTRAINT [ColumnToSetAsPrimaryKey] PRIMARY KEY ([ColumnToSetAsPrimaryKey]) 

请注意围绕PRIMARY KEY选项后的列名称的括号。

尽管这篇文章比较陈旧,而且我正在对请求者的需求作出一个假设,但我认为这些附加信息可能对用户遇到此线程有所帮助,因为我相信对话可能导致人们相信现有的列不能成为设置为主键而不将其作为新列添加,这将是不正确的。

2

我是一名java开发人员,碰巧遇到一个没有DBA的团队,而且作为一名开发人员,我无法获得DBA权限。我的任务是在两个数据库之间移动整个模式,因此如果没有DBA,我必须通过运行脚本来完成,而不能在SQL Server 2008中使用GUI,因为我没有管理员权限。

但是,当在新的schema.table上运行存储过程时,所有内容都没有问题,我发现我丢失了表中的标识字段。我仔细检查了创建表的脚本并且它在那里,但是,当我运行脚本时,SQL Server没有得到它。之后DBA告诉我他之前看到过这个相同的问题。

在任何情况下,对于SQL Server 2008,这些都是我为了解决这个问题而采取的步骤,因此我在此发布此信息,希望它对某人有所帮助。这是我所做的,因为我在另一个表上使FK依赖关系变得更加困难:

我使用此查询来验证身份确实缺失并查看表上的依赖关系。

1)查找统计上的表:

exec sp_help 'dbo.table_name_old'; 

2)创建一个重复,相同的新表,除了在PK场的地方收到了添加标识字段。

3.)禁用标识移动数据。

SET IDENTITY_INSERT dbo.table_name ON 

4.)传输数据。

INSERT INTO dbo.table_name_new 
(
field1, field2, etc... 
) 
SELECT 
field1, field2, etc... 
FROM 
dbo.table_name_old; 

5.)验证数据是否存在。

SELECT * FROM dbo.table_name_new 

6.)重新启用身份。

SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF 

7)这是我发现把所有的FK关系,以验证该表(S)作为依赖 原始表引用和我碰到很多,所以它是一个门将最好的脚本!

SELECT f.name AS ForeignKey, 
    OBJECT_NAME(f.parent_object_id) AS TableName, 
    COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, 
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
    COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName 
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
    ON f.OBJECT_ID = fc.constraint_object_id 
    ORDER BY ReferenceTableName; 

8)请确保您有所有的PK和FK脚本参与,这一步之前的所有表。

ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK] 

9)上使用的语法每个键,这个脚本使用SQL Server 2008

10)从依赖表(S删除该FK(S)),您可以用鼠标右键单击

11)删除原始表:

DROP TABLE dbo.table_name_old; 

13)后续计划依靠你在SQL Server 2008中的步骤创建的脚本9

- 将PK添加到新表中。

- 将FK添加到新表中。

- 将FK添加回依赖关系表。

14.)确认一切正确和完整。我使用GUI来查看表格。

15.)将新表重命名为原始表名。

exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]'; 

最后,一切正常!

0

基本上有四个逻辑步骤。

  1. 创建一个新的标识列。为这个新列打开插入标识。

  2. 将数据从源列(您希望转换为Identity的列)插入到此新列中。

  3. 关闭新列的插入标识。

  4. 删除源列&将新列重命名为源列的名称。

可能有一些更复杂的工作,如跨多台服务器等工作。

请参考以下文章中的步骤(使用ssms & T-sql)。这些步骤适用于对T-SQL不太熟悉的初学者。

http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx

0

用于与主键=不具有标识组的bigint所有表生成的脚本;这将返回每个表生成的脚本列表;

SET NOCOUNT ON; 

declare @sql table(s varchar(max), id int identity) 

DECLARE @table_name nvarchar(max), 
     @table_schema nvarchar(max); 

DECLARE vendor_cursor CURSOR FOR 
SELECT 
    t.name, s.name 
FROM sys.schemas AS s 
INNER JOIN sys.tables AS t 
    ON s.[schema_id] = t.[schema_id] 
WHERE EXISTS (
    SELECT 
    [c].[name] 
    from sys.columns [c] 
    join sys.types [y] on [y].system_type_id = [c].system_type_id 
    where [c].[object_id] = [t].[object_id] and [y].name = 'bigint' and [c].[column_id] = 1 
) and NOT EXISTS 
(
    SELECT 1 FROM sys.identity_columns 
    WHERE [object_id] = t.[object_id] 
) and exists (
    select 1 from sys.indexes as [i] 
    inner join sys.index_columns as [ic] ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id 
    where object_name([ic].[object_id]) = [t].[name] 
) 
OPEN vendor_cursor 

FETCH NEXT FROM vendor_cursor 
INTO @table_name, @table_schema 

WHILE @@FETCH_STATUS = 0 
BEGIN 

DELETE FROM @sql 

declare @pkname varchar(100), 
    @pkcol nvarchar(100) 

SELECT top 1 
     @pkname = i.name, 
     @pkcol = COL_NAME(ic.OBJECT_ID,ic.column_id) 
FROM sys.indexes AS [i] 
INNER JOIN sys.index_columns AS [ic] ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id 
WHERE i.is_primary_key = 1 and OBJECT_NAME(ic.OBJECT_ID) = @table_name 

declare @q nvarchar(max) = 'SELECT '[email protected]+' FROM ['[email protected]_schema+'].['[email protected]_name+'] ORDER BY '[email protected]+' DESC' 

DECLARE @ident_seed nvarchar(max) -- Change this to the datatype that you are after 
SET @q = REPLACE(@q, 'SELECT', 'SELECT TOP 1 @output = ') 
EXEC sp_executeSql @q, N'@output bigint OUTPUT', @ident_seed OUTPUT 

insert into @sql(s) values ('BEGIN TRANSACTION') 
insert into @sql(s) values ('BEGIN TRY') 

-- create statement 
insert into @sql(s) values ('create table ['[email protected]_schema+'].[' + @table_name + '_Temp] (') 

-- column list 
insert into @sql(s) 
select 
    ' ['+[c].[name]+'] ' + 
    y.name + 

    (case when [y].[name] like '%varchar' then 
    coalesce('('+(case when ([c].[max_length] < 0 or [c].[max_length] >= 1024) then 'max' else cast([c].max_length as varchar) end)+')','') 
    else '' end) 

    + ' ' + 
    case when [c].name = @pkcol then 'IDENTITY(' +COALESCE(@ident_seed, '1')+',1)' else '' end + ' ' + 
    (case when c.is_nullable = 0 then 'NOT ' else '' end) + 'NULL ' + 
    coalesce('DEFAULT ('+(
     REPLACE(
      REPLACE(
       LTrim(
        RTrim(
         REPLACE(
          REPLACE(
           REPLACE(
            REPLACE(
             LTrim(
              RTrim(
               REPLACE(
                REPLACE(
                 object_definition([c].default_object_id) 
                ,' ','~') 
               ,')',' ') 
              ) 
             ) 
            ,' ','*') 
           ,'~',' ') 
          ,' ','~') 
         ,'(',' ') 
        ) 
       ) 
      ,' ','*') 
     ,'~',' ') 
    ) + 
    case when object_definition([c].default_object_id) like '%get%date%' then '()' else '' end 
    + 
    ')','') + ',' 
from sys.columns c 
JOIN sys.types y ON y.system_type_id = c.system_type_id 
    where OBJECT_NAME(c.[object_id]) = @table_name and [y].name != 'sysname' 
order by [c].column_id 


update @sql set s=left(s,len(s)-1) where [email protected]@identity 

-- closing bracket 
insert into @sql(s) values(')') 

insert into @sql(s) values('SET IDENTITY_INSERT ['[email protected]_schema+'].['[email protected]_name+'_Temp] ON') 

declare @cols nvarchar(max) 
SELECT @cols = STUFF(
    (
     select ',['+c.name+']' 
     from sys.columns c 
     JOIN sys.types y ON y.system_type_id = c.system_type_id 
     where c.[object_id] = OBJECT_ID(@table_name) 
     and [y].name != 'sysname' 
     and [y].name != 'timestamp' 
     order by [c].column_id 
     FOR XML PATH ('') 
    ) 
    , 1, 1, '') 

insert into @sql(s) values('IF EXISTS(SELECT * FROM ['[email protected]_schema+'].['[email protected]_name+'])') 
insert into @sql(s) values('EXEC(''INSERT INTO ['[email protected]_schema+'].['[email protected]_name+'_Temp] ('[email protected]+')') 
insert into @sql(s) values('SELECT '[email protected]+' FROM ['[email protected]_schema+'].['[email protected]_name+']'')') 

insert into @sql(s) values('SET IDENTITY_INSERT ['[email protected]_schema+'].['[email protected]_name+'_Temp] OFF') 


insert into @sql(s) values('DROP TABLE ['[email protected]_schema+'].['[email protected]_name+']') 

insert into @sql(s) values('EXECUTE sp_rename N''['[email protected]_schema+'].['[email protected]_name+'_Temp]'', N'''[email protected]_name+''', ''OBJECT''') 

if (@pkname is not null) begin 
    insert into @sql(s) values('ALTER TABLE ['[email protected]_schema+'].['[email protected]_name+'] ADD CONSTRAINT ['[email protected]+'] PRIMARY KEY CLUSTERED (') 
    insert into @sql(s) 
     select ' ['+COLUMN_NAME+'] ASC,' from information_schema.key_column_usage 
     where constraint_name = @pkname 
     GROUP BY COLUMN_NAME, ordinal_position 
     order by ordinal_position 

    -- remove trailing comma 
    update @sql set s=left(s,len(s)-1) where [email protected]@identity 
    insert into @sql(s) values (' )') 
end 

insert into @sql(s) values ('--Run your Statements') 
insert into @sql(s) values ('COMMIT TRANSACTION') 
insert into @sql(s) values ('END TRY') 
insert into @sql(s) values ('BEGIN CATCH') 
insert into @sql(s) values ('  ROLLBACK TRANSACTION') 
insert into @sql(s) values ('  DECLARE @Msg NVARCHAR(MAX) ') 
insert into @sql(s) values ('  SELECT @Msg=ERROR_MESSAGE() ') 
insert into @sql(s) values ('  RAISERROR(''Error Occured: %s'', 20, 101,@msg) WITH LOG') 
insert into @sql(s) values ('END CATCH') 

declare @fqry nvarchar(max) 

-- result! 
SELECT @fqry = (select char(10) + s from @sql order by id FOR XML PATH ('')) 


SELECT @table_name as [Table_Name], @fqry as [Generated_Query] 
PRINT 'Table: '[email protected]_name 
EXEC sp_executeSql @fqry 

    FETCH NEXT FROM vendor_cursor 
    INTO @table_name, @table_schema 
END 
CLOSE vendor_cursor; 
DEALLOCATE vendor_cursor; 
2

接受的答案是错的:你可以改变现有的列是一个身份只要它不包含任何空值。更改后,身份种子将从最大(列)+1开始。因此,您首先需要做的是为所有空值提供值。

3

简单说明

重命名使用sp_RENAME

现有柱

EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', '列'

示例重命名:

现有列UserID更名为OldUserID

EXEC sp_RENAME 'AdminUsers.UserID' , 'OldUserID', 'COLUMN' 

然后,使用变更查询来设置主键和标识值

ALTER TABLE TableName ADD Old_ColumnName INT NOT NULL PRIMARY KEY IDENTITY(1,1) 

实施例用于设置主键

新创建的列名添加新的列是用户ID

ALTER TABLE Users ADD UserID INT NOT NULL PRIMARY KEY IDENTITY(1,1) 

然后放下重命名的列

ALTER TABLE Table_Name DROP COLUMN Renamed_ColumnName 

举例落重命名的列

ALTER TABLE Users DROP COLUMN OldUserID 

现在我们已经添加的PrimaryKey和身份对表中的现有列。

1

在SQL服务器2014年(我不知道更低的版本),你可以简单地使用序列来做到这一点。

CREATE SEQUENCE sequence_name START WITH here_higher_number_than_max_existed_value_in_column INCREMENT BY 1; 

ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT NEXT VALUE FOR sequence_name FOR column_name 

从这里:Sequence as default value for a column

2

正如我在正常情况下,了解我们正在创建一个由具有标识属性
主键一个表,以便重命名删除列这是与主键约束将不可能是原因约束规则正在验证列结构。
格子式实现这一目标,我们必须处理下列方式的一些步骤:
让我们假设表名=“员工”的ColumnName =“雇员”

1.添加新列“EmployeeId_new”在在 '雇员' 表
ALTER TABLE员工添加EmployeeId_new INT IDENTITY(1,1)

  • 立即删除列“的Emp loyeeId”从‘雇员’表
    ALTER TABLE雇员DROP COLUMN雇员

  • 这将引发错误,因为主键约束规则适用和验证柱结构。
    * ### 'Msg 5074,Level 16,State 1,Line 1对象[PK_dbo.Employee]依赖于colmn [EmployeeId]。' ###

  • 因此,我们必须从表 '雇员' 先删除主键约束,然后我们就可以删除该列
    ALTER TABLE员工DROP约束[PK_dbo.Employee]

  • 现在,我们可以删除“雇员”表中的列“雇员”作为在上一步中,我们得到了错误
    ALTER TABLE雇员DROP COLUMN做雇员

  • 现在列“雇员”从表中删除 所以我们将重新命名新添加的新列“EmployeeId_new”与“雇员”
    sp_rename“Employee.EmployeeId”,“EmployeeId_new”,“列”

  • 要重新安排表相同的形式,因为它是,我们必须添加主键约束的列“雇员”
    ALTER TABLE员工添加约束[PK_dbo。雇员]主键(EMPLOYEEID)

  • 8. 现在表“雇员”与“EMPLOYEEID”被修饰为识别规则与现有的主键约束

    0

    沿着按我当前条件,我遵循这种方法。我想在通过脚本插入数据之后为主表提供标识。

    由于我想追加身份,所以它始终从1开始到我想要的记录数结束。

    --first drop column and add with identity 
    ALTER TABLE dbo.tblProductPriceList drop column ID 
    ALTER TABLE dbo.tblProductPriceList add ID INT IDENTITY(1,1) 
    
    --then add primary key to that column (exist option you can ignore) 
    IF NOT EXISTS (SELECT * FROM sys.key_constraints WHERE object_id = OBJECT_ID(N'[dbo].[PK_tblProductPriceList]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblProductPriceList]')) 
        ALTER TABLE [tblProductPriceList] ADD PRIMARY KEY (id) 
    GO 
    

    这将创建一个身份

    相同的主键列我用这个链接:https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/

    Add primary key to existing table

    1

    右键单击表名称在对象资源管理器。你会得到一些选择。点击'设计'。此表格将打开一个新选项卡。您可以在'列属性'中添加标识约束。

    1

    要修改的标识属性为列:

    • 在服务器资源管理器,你要修改,然后单击打开表定义身份属性右键单击该表。 表格在表设计器中打开。
    • 清除要更改的列的允许空值复选框。
    • 在Column Properties选项卡中,展开Identity Specification属性。
    • 单击Is Identity子元素属性的网格单元格,然后从下拉列表中选择Yes。
    • 在标识种子单元格中键入一个值。该值将被分配给表中的第一行。值1将被默认分配。

    就是这样,和它的工作对我来说