我最终设法做到了(根据我的评论),但为了做到这一点,我必须编写一些代码。最后,我创建了一些虚拟表来跟踪旧 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;
我创建了一个额外的表,用于跟踪旧 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;
这个想法是我一次复制一个 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
}
当我使用外键复制表(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, ...);
}
我试图保持简短和重点(并且与语言无关),以便可以看到该技术。在我的真实场景中,我有大约 15 个“级联”表,所以我必须跟踪每个表的新 ID,而不仅仅是 tblCustomer