如何将2个具有Uniqueidentifier的表中的数据作为PK并将数据填充到2个具有自动增加ID作为PK的新表中?

时间:2016-07-06 23:55:52

标签: sql sql-server

我有几个包含GUID类型的ID的表,几乎每个表都使用GUID而不是递增的ID,但这既不是在这里也不是它们,只是我正在处理的范围。

所以我有一张叫做的桌子 MaterialType和MaterialSubType

MaterialType构建如下

MaterialTypeID (PK, Uniqueidentifier, not null)
MaterialType (varchar(40), not null)
Code (varchar(100), not null)
EnabledInd (tinyint, not null)

MaterialSubType构建如下

MaterialSubTypeID (PK, Uniqueidentifier, not null)
MaterialTypeID (PK, Uniqueidentifier, not null)
MaterialSubType (varchar(40), not null)
Code (varchar(100), not null)
EnabledInd (tinyint, not null)

我遇到的问题是我有两个相同的更新表,除了我使用自动增量ID的事实,我需要弄清楚如何查询原始表中的数据并插入数据进入新表。

我知道我可以对表格执行“插入选择”,但这不会(至少据我所知)帮助我,因为我需要在MaterialSubType中有一个外键到MaterialType。

所以我不确定应该如何做或如何做,原因是我不是SQL或DBA的专家。

1 个答案:

答案 0 :(得分:1)

我再次做出假设:

  • code是您用于识别两个表中新记录的通用标识符

  • 自动增量标识值已启用 MaterialType.MaterialTypeIDMaterialSubType.MaterialSubTypeID (虽然如果你在两列上有一个PK,它确实没有意义 在这种情况下只需要一个)

  • 数据库位于同一SQL Server上

首先将新记录添加到MaterialType,以便我们生成密钥:

INSERT INTO TargetDB..MaterialType (MaterialType, Code, EnabledInd)
SELECT MaterialType, Code, EnabledInd
FROM SourceDB..MaterialType SRC
WHERE NOT EXISTS (
  SELECT * FROM  TGT
  WHERE TGT.Code = SRC.Code
)

现在将新记录添加到MaterialSubType。要获得目标FK值,我们需要先查找源代码中的代码值,然后使用它来查找目标中的正确FK值。

我强烈建议您首先运行没有插入的select并手动测试一些记录。

INSERT INTO TargetDB..MaterialSubType (
MaterialTypeID,
MaterialSubType,
Code,
EnabledInd
)
SELECT
-- We get this FK value by first looking up the code in the source 
-- then using that to look up the FK in the target
MT.MaterialTypeID,
SRC.MaterialSubType,
SRC.Code,
SRC.EnabledInd
FROM 
SourceDB..MaterialSubType SRC
INNER JOIN
-- Join to source lookup to find the code
SourceDB..MaterialType FK
ON SRC.MaterialTypeID = FK.MaterialTypeID
-- Now we have the source code, look up the target to get the target FK
INNER JOIN
TargetDB..MaterialType MT
ON FK.Code = MT.Code
WHERE NOT EXISTS (
    SELECT *
    FROM TargetDB..MaterialSubType TGT
    SRC.Code = TGT.Code
    )

这里可能有一些错误。如果有,并且您希望它们修复,请同时确认我的假设。