MySql树状结构的表数据平移复制到另一张表有什么方案? A表结构为:id 主键fid 父级id要求平移数据并插入两个其他字段到B表,其中主键不同,但是父子级结构要和A表相同,请问如何操作呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。 并插入两个其他字段到B表----------------------------- 这点很容易吧?应该没有什么特别需要注意的平移并改变主键,同时保持关系,这个看你的主键是怎么生成的,如果目标表结构可以临时调整的话,你可以在目标表结构中增加一列为源表主键值,这样可以直接把原表数据搬过去,按新的主键生成目标表的主键这个时候目标表每条记录就会有新的主键和源表主键,根据这个新旧关系把目标表的父级ID 更新成新表的主键ID 就行了 不改变表结构,则可以把要搬的数据放到临时表,需要额外加入的字段也加到临时表并赋值临时表额外增加两个字段:新id, 新父级id游标循环临时表每条记录,对于每条记录:1. insert 到目标表,获取新的id2. 更新临时表当前处理的记录,设置新id3. 更新临时表,更新 父级id=当前处理记录id,设置新父级id=新记录id所有数据处理完成后,通过新id关联临时表来更新目标表,设置父级id=临时表的父级id 好的原始表结构是: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如何去写 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: 0mysql> 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> 如何锁定所有表,或整个库? 怎么看mysql proxy的源代码啊 关于mysql 忽略插入重复记录问题 mysql插入最大值 php连接Mysql时,提示内存不能读 mysql数据备份求助!!! 一个极其具有挑战性的问题!(1000分相送,不够再加) MYSQL环境变量如何设置? 关于MYSQL截取中英文字符串(最高只能发100分的帖子) sql字符串替换求助 为什么虚拟机里create table速度比我母机快10倍 服务器数据同步问题
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
----------------------------- 这点很容易吧?应该没有什么特别需要注意的平移并改变主键,同时保持关系,这个看你的主键是怎么生成的,如果目标表结构可以临时调整的话,你可以在目标表结构中增加一列为源表主键值,这样可以直接把原表数据搬过去,按新的主键生成目标表的主键
这个时候目标表每条记录就会有新的主键和源表主键,根据这个新旧关系把目标表的父级ID 更新成新表的主键ID 就行了
临时表额外增加两个字段:新id, 新父级id
游标循环临时表每条记录,对于每条记录:
1. insert 到目标表,获取新的id
2. 更新临时表当前处理的记录,设置新id
3. 更新临时表,更新 父级id=当前处理记录id,设置新父级id=新记录id
所有数据处理完成后,通过新id关联临时表来更新目标表,设置父级id=临时表的父级id
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如何去写
+--------+--------+-------+---------+---------+
| 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>