[英]mysql copy data between table with parent child relation
我有两个相同的表
第一个表的结构就像一棵树,其中每个记录的行为就像一个节点。
每个节点具有三个字段,其中包括: index作为节点ID, item作为项目名称的表示, parent作为指向前一个节点(索引)的指针。
如您在图片中看到的,每个节点都基于其父索引字段关系相互关联
现在我想做的是遍历每个节点(记录)到根,然后将它们安排到具有相同结构的新表中 ,因此稍后在第二个表上将有21条记录,如图所示
我正在使用vb.net,并在下一个循环中循环每一行的索引,然后将每一行插入到新表中。.但是问题是我如何在条件为条件的情况下将**从第一张表复制到第二张表-儿童**
这是图片
这是我的伪代码
for i=1 to 11
checkindex = select * from 1st table where index = i
if checkindex.hasrows() then
traverse the row to its root then insert into 2nd table
end if
next i
所以我的问题是,根据我的伪代码,如何编码遍历每一行然后插入第二张表?
我正在使用mysql数据库和vb.net
感谢您的关注
我已经根据KJELL的伪代码更新了我的编码
For node = 1 To maxnode
'QUERY A= FETCHING ROW/NODE FROM TABLE1 BASED ON INDEX
Dim node1 As String = "select indeks, item, parent from tree where indeks = '" & node & "' "
CMD_node = New MySqlCommand(node1, conn.konek)
hasilnode = CMD_node.ExecuteReader()
If hasilnode.HasRows Then
'QUERY B = FETCH PARENT VALUE FROM CURRENT ROW
Dim getpar1 As String = "select parent from tree where indeks = '" & node & "' "
CMD_getpar = New MySqlCommand(getpar1, conn.konek)
getpar = Convert.ToInt32(CMD_getpar.ExecuteScalar())
'QUERY C = INSERT CURRENT ROW(TABLE1) TO TABLE2
Dim rec_ins As String = "insert into node (indeks, item, parent, node_id) select indeks, item, parent, '" & node & "' from tree where indeks = '" & node & "' "
CMD_recs = New MySqlCommand(rec_ins, conn.konek)
CMD_recs.ExecuteNonQuery()
CMD_recs.Connection.Dispose()
'QUERY D = CHECKING IF CURRENT ROW'S PARENT = 0 (NOT EXIST) WITH PARENT VALUE ACHIEVED FROM QUERY B
If getpar <> 0 Then
'INSERT NEWROW WHERE NEWROW.INDEX = CURRENT ROW.PARENT
Dim rec_ins2 As String = "insert into node(indeks, item, parent, node_id) select indeks, item, parent, '" & node & "' from tree where indeks = '" & getpar & "' "
CMD_recs = New MySqlCommand(rec_ins2, conn.konek)
CMD_recs.ExecuteNonQuery()
CMD_recs.Connection.Dispose()
End If
'Else
'Continue While
'End If
'End While
Else
Continue For
CMD_getpar.Connection.Dispose()
End If
CMD_node.Connection.Dispose()
Next node
CMD_list.Connection.Dispose()
此代码产生的结果与我的插图相同, 但是 table1中的每个当前行仅调用前一行一次 ,结果类似于表1中的每一行(父1的行除外)仅在table2中生成两行, 这是期望的结果是:表1中的每一行根据父索引关系在表2中生成不同数量的行
例如,表1中的“ 3 A 2”行应该在表2中生成结果:
3 A 2
2楼1
1 C 0
但是我的代码只会返回:
3 A 2
2楼1
其他行产生相同的结果, 只有 2行
您将需要一个递归函数,该函数负责像下面这样深度复制对象:
您应该在表1中查询所有对象,并在循环中调用递归深度复制功能。
希望这对你有意义...
recurvise函数可能类似于:
function storeMe(content) {
storeToDb(content)
myParentID = content[parent]
if (myParentID != 0) {
parentContent = getParentContent(myParentID)
unset(parentContent[lineID])
storeMe(parentContent)
}
}
主要功能如下所示:
myObjects = getAllFromTable1()
for(myObjects) {
storeMe(object)
}
这里的关键是:如果您的table1为数据库中的每一行使用唯一的ID,则在存储父级时必须将其取消设置,因此会向数据库写入新元素,并且不会一次又一次地更新相同的元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.