狀態描述
我有兩個資料庫,DB1
和DB2
,它們具有相同的表格Author
,其中欄位為Author.ID
和Author.AuthorName
。
DB1.Author
的Author.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粉2960800762024-03-31 00:34:23
tl;博士,您的問題是您的資料庫管理器。解決方案是讓他/她透過將資料恢復到先前的狀態來消除所造成的損害。刪除行就可以了。更新主鍵永遠不行。
不要透過解決他/她的錯誤來創建解決方案或驗證它,因為這樣做會使它更有可能再次發生。
完整答案。
您的實際問題是您的“資料庫管理員”,他違反了資料庫的基本規則:永遠不要更新代理鍵值!
在您的情況下,情況更加悲慘,因為 ID 列值中的間隙無論如何都無關緊要。如果差距確實很重要,那麼你的情況就更糟了。請容許我解釋一下...
作者姓名是您的實際識別碼。我們知道這一點是因為它有一個獨特的限制。
ID 欄位是一個代理鍵,最方便地實作為自動遞增整數,但如果代理鍵是隨機(唯一)數字,那麼代理鍵也可以正常運作。間隙,甚至值本身的選擇,與代理鍵的有效性無關。