mySQL - 使用自动增量ID将行从一个数据库复制到另一个数据库

Dav*_*ker 12 mysql

注意:如果这是重复的道歉,但我找不到解决方案.

我有两个数据库(一个dev和一个live),它们具有完全相同的模式.

为了便于解释,假设我有一个"客户"表和一个"引用"表.两个表都有自动增量ID,而引用表有一个'customerid'列,用作customer表的外键.

我的问题是我的dev数据库中有一些行要复制到实时数据库.当我复制客户行时,我可以轻松获得一个新的ID,但是如何将新的id分配给"子"引用表行?

我知道我可以手动编写INSERTS脚本来克服这个问题,但有更简单的方法吗?

编辑:这是一个简化的例子,我有大约15个表,所有表都使用自动增量和外键形成层次结构.实时数据库中有相当多的数据,因此新的ID会更大(例如dev.customer.id = 4,live.customer.id = 54)

Pau*_*aul 18

最简单的方法,无需更改任何ID

INSERT INTO to_database.to_table 
  SELECT * FROM from_table WHERE some_id = 123;
Run Code Online (Sandbox Code Playgroud)

如果不需要重新映射任何内容,则无需指定列.

希望有帮助......

  • 是的,很有帮助,但是需要更正:运行此查询时,我们需要位于from_database上(使用from_database),但是在查询本身中,它应显示为from_table,其中应显示为from_database。 (2认同)

Dav*_*ker 5

我最终设法做到了这一点(根据我的评论),但为了做到这一点,我不得不编写一些代码。最后,我创建了一些虚拟表来跟踪旧 ID 和新 ID。在使用 FK 约束复制记录时,我只是根据旧的 ID 查找新的 ID。有点啰嗦,但它奏效了。

这篇文章现在有点火了,所以我把它标记为答案。如果有人有更好的想法/解决方案,我会很乐意将其“取消标记”为已接受的答案。

编辑:根据要求,这里有一些伪代码,我希望可以解释我是如何做到的。

我有两个相关的表如下:

CREATE TABLE tblCustomers (
  Id int NOT NULL AUTO_INCREMENT,
  Name varchar(50) DEFAULT NULL,
  Address varchar(255) DEFAULT NULL,
  PRIMARY KEY (Id)
)
ENGINE = MYISAM
ROW_FORMAT = fixed;

CREATE TABLE tblQuotes (
  Id int NOT NULL AUTO_INCREMENT,
  CustomerId int(11) DEFAULT NULL,
  QuoteReference varchar(50) DEFAULT NULL,
  PRIMARY KEY (Id)
)
ENGINE = MYISAM
ROW_FORMAT = fixed;
Run Code Online (Sandbox Code Playgroud)

我创建了一个额外的表,用于根据新 ID 跟踪旧 ID

CREATE TABLE tblLookupId (
  Id int NOT NULL AUTO_INCREMENT,
  TableName varchar(50) DEFAULT NULL,
  OldId int DEFAULT NULL,
  NewId int DEFAULT NULL,
  PRIMARY KEY (Id)
)
ENGINE = MYISAM
ROW_FORMAT = fixed;
Run Code Online (Sandbox Code Playgroud)

这个想法是我一次复制一个 tblCustomer 行并在我进行时跟踪 ID,如下所示:

// copy each customer row from dev to live and track each old and new id
//
foreach (customer in tblCustomers)
{
    // track the old id
    var oldid = customer.id; // e.g. 1

    // insert the new record into the target database   
    INSERT newdb.tblCustomers (...) VALUES (...);

    // get the new id
    var newid = SELECT LAST_INSERT_ID() // e.g. 245

    // insert the old id and the new id in the id lookup table
    INSERT idlookup (TableName, OldId, NewId) VALUES ('tblCustomers', oldid, newid); // this maps 1->245 for tblCustomers
}
Run Code Online (Sandbox Code Playgroud)

当我使用外键复制表 (tblQuote) 时,我必须首先根据旧 ID 查找新 ID。

// copy each quote row from dev to live and lookup the foreign key (customer) from the lookup table
//
foreach(quote in tblQuotes)
{
    // get the old foreign key value
    var oldcustomerid = quote.CustomerId; // e.g 1

    // lookup the new value
    var newcustomerid = SELECT newid FROM tblIdLookup WHERE TableName='tblCustomers' AND oldid=oldcustomerid; // returns 245

    // insert the quote record
    INSERT tblQuotes (CustomerId, ...) VALUES (newcustomerid, ...);
}
Run Code Online (Sandbox Code Playgroud)

我试图保持简短和重点(和语言不可知),以便可以看到该技术。在我的真实场景中,我有大约 15 个“级联”表,因此我必须跟踪每个表的新 ID,而不仅仅是 tblCustomer