簡體   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