mysql使用父子关系复制表之间的数据

时间:2014-01-10 15:16:08

标签: mysql vb.net

我有两个相同的表

第一个表的结构就像一棵树,每个记录就像一个节点。

每个节点有三个字段包括:索引作为node-id, item 作为项目名称的表示,父母作为指针到上一个节点(索引)..

正如您可以在图片中看到的每个节点基于其父索引字段关系

相互关联

现在我想做的是遍历每个节点(记录)到根,然后将它们安排到一个具有相同结构的新表,所以稍后在第二个表上会有 21记录如图所示

我正在使用vb.net并进行下一次循环以循环每行的索引,然后将每一行插入一个新表..但问题是我如何将数据从第一个表复制到第二个表条件亲子**

这是图片

enter image description here

这是我的伪代码

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的PSEUDOCODE更新了我的编码

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中的每一行在table2中生成不同的行数,根据父指数关系

例如table1中的行“3 A 2”,应该在table2中生成结果:

3 A 2

2 F 1

1 C 0

但我的代码只返回:

3 A 2

2 F 1

和其他行生成相同的结果, 2行

1 个答案:

答案 0 :(得分:0)

你需要一个递归函数,它负责深度复制对象,如下所示:

  • 将我的内容复制到表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,你必须在存储父项时取消设置它,所以一个新的元素被写入数据库而不是一遍又一遍地更新。