首頁  >  問答  >  主體

在索引更改時,將行從一個表複製到另一個表的SQL操作

狀態描述

我有兩個資料庫,DB1DB2,它們具有相同的表格Author,其中欄位為Author.IDAuthor.AuthorName

DB1.AuthorAuthor.ID 欄位 AUTO_INCRMENT,而DB2.Author 沒有 AUTO_INCRMENT ,因為它依賴DB1 資料的正確性.

兩個表都有 Author.ID 上的 PRIMARY 索引和 Author.AuthorName 上的唯一索引。

DB2.Author 具有從 DB1.Author 複製的行。

兩個資料庫皆使用 MariaDB 版本 10.6.7。


問題

DB1 管理員刪除了 DB1.Author 表中的一些條目,然後重新排序了索引以使索引號碼沒有間隙。這意味著他們可能已經:

ID 作者姓名
1 一個
2 B
3 C

然後他們刪除了 AuthorName'B' 的行:

ID 作者姓名
1 一個
3 C

他們最終更新了索引,使其沒有間隙(3-C 更改為 2-C):

ID 作者姓名
1 一個
2 C

現在我需要找到一種方法將行的更新狀態從DB1.Author 複製到DB2.Author 而不刪除DB2.Author 表中的所有內容,這樣我就不會'不會丟失CASCADE 效果的資料。

最好的方法是什麼?


我的鏡頭

#這就是我所做的,但它顯然無法工作,因為在重複鍵的情況下,它會嘗試創建另一個重複鍵(重複的ID 2 會嘗試插入' C' 的重複值,因為它ID 上已存在3):

INSERT INTO DB2.Author (ID, AuthorName)
SELECT DB1.Author.ID, DB1.Author.AuthorName FROM DB1.Author
ON DUPLICATE KEY UPDATE
    ID = DB1.Author.ID,
    AuthorName = DB1.Author.AuthorName;

其他方法?

除了可能的SQL查詢解決方案之外,是否還有其他方法可以在一個資料庫更改資料時自動更新另一個資料庫中的表資料?僅需複製某些表,而其他連結表則不同。

P粉459440991P粉459440991186 天前312

全部回覆(1)我來回復

  • P粉296080076

    P粉2960800762024-03-31 00:34:23

    tl;博士,您的問題是您的資料庫管理器。解決方案是讓他/她透過將資料恢復到先前的狀態來消除所造成的損害。刪除行就可以了。更新主鍵永遠不行。

    不要透過解決他/她的錯誤來創建解決方案或驗證它,因為這樣做會使它更有可能再次發生。


    完整答案。

    您的實際問題是您的“資料庫管理員”,他違反了資料庫的基本規則:永遠不要更新代理鍵值!

    在您的情況下,情況更加悲慘,因為 ID 列值中的間隙無論如何都無關緊要。如果差距確實很重要,那麼你的情況就更糟了。請容許我解釋一下...

    作者姓名是您的實際識別碼。我們知道這一點是因為它有一個獨特的限制。

    ID 欄位是一個代理鍵,最方便地實作為自動遞增整數,但如果代理鍵是隨機(唯一)數字,那麼代理鍵也可以正常運作。間隙,甚至值本身的選擇,與代理鍵的有效性無關。

    回覆
    0
  • 取消回覆