【问题标题】:copy section/category while updating linked column更新链接列时复制部分/类别
【发布时间】:2013-09-09 16:25:52
【问题描述】:

我有两个部分/类别结构的链接表。

the section table structure
id sec_title
1  section 1
2  section 2

the category structure
id sectionid cat_title
1  1  cat1
2  1  cat2
3  2  cat 3
4  2  cat 4

有没有一种简单的方法可以将一个部分及其所有类别复制到同一个部分和类别表中?

如果我直接复制,问题是类别表中复制行的“sectionid”不是新部分行的 id。相反,它是旧行的 sectionid。

我需要“sectionid”是新插入的部分行的 id。

复制的版本

section table structure:

id sec_title
1  section 1
2  section 2
3  copy of section 1
4  copy of section 2

the category structure
id sectionid cat_title
1  1  cat1
2  1  cat2
3  2  cat 3
4  2  cat 4
5  3  cat1
6  3  cat2
7  4  cat 3
8  4  cat 4

【问题讨论】:

    标签: mysql copy


    【解决方案1】:

    已更新您可以像这样一次克隆多个部分

    INSERT INTO section (sec_title) 
    SELECT CONCAT('Copy of ', sec_title)
      FROM section
     WHERE id IN(1, 2)
     ORDER BY id;
    
    INSERT INTO category (sectionid, cat_title)
    SELECT LAST_INSERT_ID() + rnum, cat_title
      FROM 
    (
      SELECT sectionid, cat_title, @n := IF(@g = sectionid, @n + 1, 0) rnum, @g := sectionid
        FROM category CROSS JOIN (SELECT @n := -1, @g := NULL) i
       WHERE sectionid IN (1, 2)
       ORDER BY sectionid, id
    )q;
    

    这里是SQLFiddle演示


    回答原始问题:

    有没有一种简单的方法可以将一个部分及其所有类别复制到同一个部分和类别表中?

    假设两个表中的 id 列都是 auto_increment 列,并且您想克隆第 2 部分,您可以这样做

    INSERT INTO section (sec_title) 
    SELECT CONCAT('Copy of ', sec_title)
      FROM section
     WHERE id = 2;
    INSERT INTO category (sectionid, cat_title)
    SELECT LAST_INSERT_ID(), cat_title
      FROM category
     WHERE sectionid = 2;
    

    这里是SQLFiddle演示


    你可以把它包装在一个存储过程中

    DELIMITER $$
    CREATE PROCEDURE clone_section(IN _sectionid INT)
    BEGIN
      INSERT INTO section (sec_title) 
      SELECT CONCAT('Copy of ', sec_title)
        FROM section
       WHERE id = _sectionid;
      INSERT INTO category (sectionid, cat_title)
      SELECT LAST_INSERT_ID(), cat_title
        FROM category
       WHERE sectionid = _sectionid;
    END$$
    DELIMITER ;
    

    然后使用它

    CALL clone_section(2);
    

    这里是SQLFiddle演示

    【讨论】:

    • 如果在一个语句中添加了多个部分行,这是否也有效?即,如果第一个语句是“SELECT blah FROM SECTIONS WHERE user_id=3”,那么插入了多个部分。请参阅上面复制了两个部分行和四个类别行的位置。
    • 不,它不能同时处理多个部分。但是您没有在原始问题中提到 important 细节。您的问题中没有任何内容暗示您打算一次克隆多个部分。
    • 查看更新的答案。您可以在两个插入中将IN(1, 2) 替换为IN(SELECT id FROM sections WHERE ...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多