【问题标题】:How to get proper relationship between tables in merge statement?如何在合并语句中获得表之间的正确关系?
【发布时间】:2017-08-27 12:19:00
【问题描述】:

数据库A中有两个表。

表 1:

人:

person_id,
row1,
row2

教育:

education_id PK,
person_id FK,
row3,
row4

我想将此表合并到数据库B。我使用临时表来保存记录,但是pk key有问题。在数据库 b 上的表中,主键是自动递增的。如何记住数据库 b 中表之间的连接,以便创建相同的连接但具有新的主键编号。 例如: 教育

education_id person_id
1            3
2            5
3            8

首先我对人使用了合并。优秀的所有数据都被合并到数据库 B 中,具有新的 PK 值。现在我想要合并教育表,但与数据库 B 具有相同的关系(与数据库 A 中的关系),但具有新的 pk 值。怎么做?我不确定我是否很好地解释了这个问题。如果有任何问题,请向他们提问。

【问题讨论】:

  • 只需在源和目标之间使用“暂存”表。在那里您可以维护新旧主键之间的关系,这将有助于您进行后续更新。

标签: sql sql-server database merge


【解决方案1】:

假设您有 2 个临时表,包括源数据

DECLARE @Person AS TABLE (personid int)

DECLARE @Education AS TABLE (educationid int, personid int)

DECLARE @MaxPersonId int ---- max Person ID in database B

您可以执行以下步骤将数据插入数据库 B。 SET IDENTITY_INSERT dbo.Person ON是更新的关键

 -- 1. UPDATE temp table WITH new PersonId
UPDATE personid in temp Table
UPDATE @Person
SET
    personid = personid + @MaxPersonId

UPDATE @Education
SET
    personid = personid + @MaxPersonId

-- 2. INSERT person in to database B
-- SET IDENTITY_INSERT dbo.Person ON would do the trick. 
-- You could insert a primary auto-increment field by a fixed value
 SET IDENTITY_INSERT dbo.Person ON
  -- Insert person from temp table @Person
  INSERT INTO dbo.Person (PersonId) 
  SELECT p.personid FROM @Person p

 SET IDENTITY_INSERT dbo.Person OFF

-- 3. INSERT INTO dbo.Education from @Education.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 2017-01-29
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2016-09-25
    相关资源
    最近更新 更多