将具有关联关系的表1导出到具有已重置ID的表2到表3;

时间:2019-06-28 07:37:50

标签: mysql sql

我有3个表需要导出为.sql以便将来导入。我需要导出的主表通过另一个表与一个表有关系。您可以看到以下模式的提要:

enter image description here

主要问题是每个表的id都不像预期的那样从1开始,因为在开发阶段有很多测试输入。

在此示例中,是否可以在.sql文件中将包含已重置ID的关系(image_tags,标签)的图像表导出到图像等(对于其他表,等等),但保持对应于新ID的关系?

1 个答案:

答案 0 :(得分:0)

首先,在当前/ LIVE数据库中不要执行以下任何操作。如您所说,您想将数据导出到其他数据库,请将以下步骤应用于其他数据库-

第1步:使用LIVE数据库中的数据来准备新数据库。

步骤2:将2个新列“ image_id_new”和“ tag_id_new”添加到“ images_tags”表中。

步骤3:执行以下两个脚本,以更新新创建的2列-

  

在执行以下脚本之前,请确保“ image_id”和“ tag_id”两列中均没有0值可用

UPDATE images_tags A
INNER JOIN 
(
    SELECT image_id,
    @row_num := IF(`image_id` <> 0,@row_num+1,0)AS RowNumber     
    FROM images_tags,
    (SELECT @row_num := 0) r
    ORDER BY image_id
)B ON A.image_id = B.image_id
SET A.image_id_new = RowNumber;

UPDATE images_tags A
INNER JOIN 
(
    SELECT tag_id,
    @row_num := IF(`tag_id` <> 0,@row_num+1,0)AS RowNumber   
    FROM images_tags,
    (SELECT @row_num := 0) r
    ORDER BY tag_id
)B ON A.tag_id = B.tag_id
SET A.tag_id_new = RowNumber;

第4步:请删除表Images >> Images_Tags >> Tag之间的关系(如果有)。

步骤5:现在,使用以下脚本更新所有三个表-

UPDATE images A INNER JOIN images_tags B ON A.id = B.image_id
SET A.id = B.image_id_new;

UPDATE tags A INNER JOIN images_tags B ON A.id = B.tag_id
SET A.id = B.tag_id_new;

UPDATE images_tags
SET image_id = image_id_new,tag_id = tag_id_new;

步骤6:使用以下脚本从表images_tags中删除这两个新列-

ALTER TABLE `images_tags` 
DROP COLUMN `tag_id_new`,
DROP COLUMN `image_id_new`;

步骤7:如果需要,重新建立表Images >> Images_Tags >> Tag之间的关系。

就是这样。希望这会有所帮助。