A表结构为:
id   主键
fid  父级id
要求平移数据并插入两个其他字段到B表,其中主键不同,但是父子级结构要和A表相同,请问如何操作呢?

解决方案 »

  1.   

      建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
      

  2.   

    并插入两个其他字段到B表
    ----------------------------- 这点很容易吧?应该没有什么特别需要注意的平移并改变主键,同时保持关系,这个看你的主键是怎么生成的,如果目标表结构可以临时调整的话,你可以在目标表结构中增加一列为源表主键值,这样可以直接把原表数据搬过去,按新的主键生成目标表的主键
    这个时候目标表每条记录就会有新的主键和源表主键,根据这个新旧关系把目标表的父级ID 更新成新表的主键ID 就行了
      

  3.   

    不改变表结构,则可以把要搬的数据放到临时表,需要额外加入的字段也加到临时表并赋值
    临时表额外增加两个字段:新id, 新父级id
    游标循环临时表每条记录,对于每条记录:
    1. insert 到目标表,获取新的id
    2. 更新临时表当前处理的记录,设置新id
    3. 更新临时表,更新 父级id=当前处理记录id,设置新父级id=新记录id
    所有数据处理完成后,通过新id关联临时表来更新目标表,设置父级id=临时表的父级id
      

  4.   

    好的原始表结构是:
    CREATE TABLE `tb_programme_tamplate_tree` (
      `ptt_id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `ptf_id` INT(10) NOT NULL DEFAULT '0' COMMENT '父级id',
      `title` VARCHAR(50) DEFAULT NULL COMMENT '节点名',
      `content` TEXT COMMENT '内容',
      `pt_type` INT(10) DEFAULT '2' COMMENT '类型id',
      PRIMARY KEY (`ptt_id`)
    )
    假设现在有三条数据:
    INSERT INTO tb_programme_tamplate_tree(ptt_id,ptf_id)VALUES(1,0);
    INSERT INTO tb_programme_tamplate_tree(ptt_id,ptf_id)VALUES(2,1);
    INSERT INTO tb_programme_tamplate_tree(ptt_id,ptf_id)VALUES(3,1);
    第二三条均为第一条的子级需要插入数据的表:
    CREATE TABLE `tb_work_plan` (
      `wp_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `wf_id` int(10) NOT NULL DEFAULT '0' COMMENT '父级id',
      `title` varchar(50) DEFAULT NULL COMMENT '节点名称',
      `contont` text COMMENT '内容',
      `status` smallint(1) NOT NULL DEFAULT '0' COMMENT '审核状态',
      `aud_op` text COMMENT '审核意见',
      `pp_id` int(10) DEFAULT NULL COMMENT '项目id',
      PRIMARY KEY (`wp_id`)
    )
    如何把上面三条数据复制过来并且补全最后三个字段?前提是主键用自增,主要是这个wf_id如何去写
      

  5.   

    mysql> select * from tb_programme_tamplate_tree;
    +--------+--------+-------+---------+---------+
    | ptt_id | ptf_id | title | content | pt_type |
    +--------+--------+-------+---------+---------+
    |      1 |      0 | NULL  | NULL    |       2 |
    |      2 |      1 | NULL  | NULL    |       2 |
    |      3 |      1 | NULL  | NULL    |       2 |
    +--------+--------+-------+---------+---------+
    3 rows in set (0.00 sec)mysql> select * from tb_work_plan;
    Empty set (0.00 sec)mysql> desc tb_work_plan;
    +---------+-------------+------+-----+---------+----------------+
    | Field   | Type        | Null | Key | Default | Extra          |
    +---------+-------------+------+-----+---------+----------------+
    | wp_id   | int(10)     | NO   | PRI | NULL    | auto_increment |
    | wf_id   | int(10)     | NO   |     | 0       |                |
    | title   | varchar(50) | YES  |     | NULL    |                |
    | contont | text        | YES  |     | NULL    |                |
    | status  | smallint(1) | NO   |     | 0       |                |
    | aud_op  | text        | YES  |     | NULL    |                |
    | pp_id   | int(10)     | YES  |     | NULL    |                |
    +---------+-------------+------+-----+---------+----------------+
    7 rows in set (0.01 sec)mysql>mysql> insert into tb_work_plan
        -> select ptt_id,ptf_id,title,content,pt_type,'audop_name',ptt_id
        -> from tb_programme_tamplate_tree;
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    mysql> select * from tb_work_plan;
    +-------+-------+-------+---------+--------+------------+-------+
    | wp_id | wf_id | title | contont | status | aud_op     | pp_id |
    +-------+-------+-------+---------+--------+------------+-------+
    |     1 |     0 | NULL  | NULL    |      2 | audop_name |     1 |
    |     2 |     1 | NULL  | NULL    |      2 | audop_name |     2 |
    |     3 |     1 | NULL  | NULL    |      2 | audop_name |     3 |
    +-------+-------+-------+---------+--------+------------+-------+
    3 rows in set (0.00 sec)mysql>