将列更改为标识
Alter column to be identity
我已经阅读了以下关于无法将列创建为常规 int 后将其更改为标识的答案。
Adding an identity to an existing column
How to Alter a table for Identity Specification is identity SQL Server
How to alter column to identity(1,1)
但问题是我有一个 table,它已迁移到一个新的 ID,从一开始就没有将 ID 声明为身份,因为旧的 table 是用由于清除历史数据,很久以前的ID身份丢失了行。据我所知,如果我在新 table 上添加一个新列作为标识,它将自动按顺序创建该列,我需要按原样保留旧 table 中的 ID,因为已经有数据链接到这些以前的 ID。
如何将我的 ID 列从新的 table 转换为标识,但不是按顺序,而是使用旧 table 的 ID?
如果您要从以前的版本复制过来的字段中没有空值,您可以首先通过执行 max(Id) select 来找出最大的 ID 是什么。然后使用 SSMS 去添加你的新字段,当你将它设置为标识时,只需将 SEED 值设置为高于当前最大值的值,这样你就不会在新插入时发生冲突。
您可以试试这个方法:
- 使用
SET IDENTITY_INSERT <new table> ON
插入具有旧 ID 的行。这允许您插入自己的 ID。
- 重新植入身份,将其设置为 最高 ID 值 +1 和
DBCC CHECKIDENT ('<new table>', RESEED, <max ID + 1>)
。这将使您的身份从最高 ID 开始递增。
代码中类似这样的内容:
-- Disable auto increment
SET IDENTITY_INSERT <new table> ON
-- <INSERT STUFF HERE>
SET IDENTITY_INSERT <new table> OFF
-- Reseed Identity from max ID
DECLARE @maxval Int
SET @maxval = ISNULL(
(
SELECT
MAX(<identity column>) + 1
FROM <new table>
), 0)
DBCC CHECKIDENT ('<new table>', RESEED, @maxval)
编辑:当然,这种方法要求您的 ID 列是身份。
我有一个过程,其中在源文件、CSV 和生产文件 table 之间使用临时文件 table。 temp table 必须匹配 CSV 文件列,此数据中没有 PK。
为了找到 Azure 数据工厂失败前后的一组行,我将超过 2,000,000 行导入到临时 table。该进程在 Azure 中停止在 1,500,000 行。
错误是整数或字符串将被截断。
这行代码将 PK 添加到临时 table 并递增它:
ALTER TABLE ##FLATFILETEMPBDI ADD ROWNUM INT IDENTITY
这将是获取行号的最简单的解决方案。然后我能够执行此查询以查找 1,500,000 之前和之后的行:
SELECT
ROWNUM
, PARTDESCRIPTION
, LEN(PARTDESCRIPTION) AS LENDESCR
, QUANTITY
, ONORDER
, PRICE
, MANUFACTURERPARTNUMBER
FROM ##FLATFILETEMPBDI
WHERE ROWNUM BETWEEN 1499990 AND 1500005
工作完美——我没想到它会这么简单,当任何人看到带有 IDENTITY 的 ALTER TABLE 可以为我进行编号时,我感到很惊讶。
我已经阅读了以下关于无法将列创建为常规 int 后将其更改为标识的答案。
Adding an identity to an existing column
How to Alter a table for Identity Specification is identity SQL Server
How to alter column to identity(1,1)
但问题是我有一个 table,它已迁移到一个新的 ID,从一开始就没有将 ID 声明为身份,因为旧的 table 是用由于清除历史数据,很久以前的ID身份丢失了行。据我所知,如果我在新 table 上添加一个新列作为标识,它将自动按顺序创建该列,我需要按原样保留旧 table 中的 ID,因为已经有数据链接到这些以前的 ID。
如何将我的 ID 列从新的 table 转换为标识,但不是按顺序,而是使用旧 table 的 ID?
如果您要从以前的版本复制过来的字段中没有空值,您可以首先通过执行 max(Id) select 来找出最大的 ID 是什么。然后使用 SSMS 去添加你的新字段,当你将它设置为标识时,只需将 SEED 值设置为高于当前最大值的值,这样你就不会在新插入时发生冲突。
您可以试试这个方法:
- 使用
SET IDENTITY_INSERT <new table> ON
插入具有旧 ID 的行。这允许您插入自己的 ID。 - 重新植入身份,将其设置为 最高 ID 值 +1 和
DBCC CHECKIDENT ('<new table>', RESEED, <max ID + 1>)
。这将使您的身份从最高 ID 开始递增。
代码中类似这样的内容:
-- Disable auto increment
SET IDENTITY_INSERT <new table> ON
-- <INSERT STUFF HERE>
SET IDENTITY_INSERT <new table> OFF
-- Reseed Identity from max ID
DECLARE @maxval Int
SET @maxval = ISNULL(
(
SELECT
MAX(<identity column>) + 1
FROM <new table>
), 0)
DBCC CHECKIDENT ('<new table>', RESEED, @maxval)
编辑:当然,这种方法要求您的 ID 列是身份。
我有一个过程,其中在源文件、CSV 和生产文件 table 之间使用临时文件 table。 temp table 必须匹配 CSV 文件列,此数据中没有 PK。
为了找到 Azure 数据工厂失败前后的一组行,我将超过 2,000,000 行导入到临时 table。该进程在 Azure 中停止在 1,500,000 行。
错误是整数或字符串将被截断。
这行代码将 PK 添加到临时 table 并递增它:
ALTER TABLE ##FLATFILETEMPBDI ADD ROWNUM INT IDENTITY
这将是获取行号的最简单的解决方案。然后我能够执行此查询以查找 1,500,000 之前和之后的行:
SELECT
ROWNUM
, PARTDESCRIPTION
, LEN(PARTDESCRIPTION) AS LENDESCR
, QUANTITY
, ONORDER
, PRICE
, MANUFACTURERPARTNUMBER
FROM ##FLATFILETEMPBDI
WHERE ROWNUM BETWEEN 1499990 AND 1500005
工作完美——我没想到它会这么简单,当任何人看到带有 IDENTITY 的 ALTER TABLE 可以为我进行编号时,我感到很惊讶。