繁体   English   中英

mysql在表与父子关系之间复制数据

[英]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行

您将需要一个递归函数,该函数负责像下面这样深度复制对象:

  • 将我的内容复制到表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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM