我有兩個帶有回圈外鍵的表,如下所示:
CREATE TABLE entity (
id int NOT NULL AUTO_INCREMENT,
-- some extra irrelevant data commented out
active_version_id int DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE entityversion (
id int NOT NULL AUTO_INCREMENT,
-- some extra irrelevant data commented out
entity_id int NOT NULL,
PRIMARY KEY (id)
);
ALTER TABLE entity ADD FOREIGN KEY (active_version_id) REFERENCES entityversion(id) ON DELETE SET NULL;
ALTER TABLE entityversion ADD FOREIGN KEY (entity_id) REFERENCES entity(id) ON DELETE CASCADE;
我想在創建一個新物體時同時創建它的第一個 EntityVersion,這將是它的 active_version。問題是我們還沒有他們的身份證。目前,我們正在使用“回傳 id”創建物體,并使用它來創建 EntityVersion,也使用“回傳 id”,然后更新同一物體的 active_version_id,因此 3 個單獨的命令,例如:
INSERT INTO entity DEFAULT VALUES RETURNING id;
-- get the ID back and use it as a parameter to the next command
INSERT INTO entityversion (entity_id) VALUES (%s) RETURNING id;
-- again the same thing
UPDATE entity SET active_version_id = %s WHERE id = %s;
我想知道是否有更短的方法可以做到這一點。如果碰巧是更好的選擇,我也接受表模式的不同方法作為答案。謝謝您的幫助!
uj5u.com熱心網友回復:
您是在暗示物體是 1:1,在這種情況下,它們也可能在同一個表中。(如果稍后才插入,則將其設為 NULLable 之一。)
如果它是 1:many(一個“最新”和許多“舊”版本),那么 FK 只會走一條路。
無論哪種情況,您的“圓形” FK 都會消失。
但要回答你的問題:
- 關閉 FK 檢查
- 創建兩個表
- 填充兩個表
- ALTER 添加兩個 FK
- 打開 FK 檢查。
uj5u.com熱心網友回復:
在存盤程序中創建兩行,或者如果沒有僅在 entityversion 版本表中的資料,則使用插入前觸發器。為了處理您的回圈 id 問題,在 mariadb 中使用序列而不是 auto_increment。在 mysql 中,使用僅包含 auto_increment id 的 entity_sequence 表來模擬序列。在您的存盤程序/觸發器中,獲取序列值(insert..returning id如果模擬序列),使用該值存盤 entityversion,然后將 entityversion id 設定為存盤在您的物體行中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/418293.html
標籤:
下一篇:如何將多個網址重定向到同一個網址
