[英]How does lastInsertId() work for tables without auto-incremented fields?
[英]MySQL batch load of multiple tables with auto-incremented fields as foreign keys
考慮以下人為設計的示例,其中FOREST包含TREE,而TREE具有BRANCH 。 另外,一個或多個FLOCK包含BIRD,並且BIRD可能在BRANCH上,也可能不在。
CREATE TABLE 'FOREST' (
forest_id INT(11) NOT NULL AUTO_INCREMENT,
'name' VARCHAR(45) NOT NULL,
...
)
CREATE TABLE 'TREE' (
'tree_id' INT(11) NOT NULL AUTO_INCREMENT,
'forest_id' INT(11) NOT NULL ,
'tree_loc_x' INT NOT NULL,
'tree_loc_y' INT NOT NULL,
...
CONSTRAINT 'fk_tree_forest'
FOREIGN KEY ('forest_id' )
REFERENCES `FOREST` ('forest_id' )
)
CREATE TABLE 'BRANCH' (
'branch_id' INT(11) NOT NULL AUTO_INCREMENT,
'tree_id' INT(11) NOT NULL,
'br_loc_x' INT NOT NULL,
'br_loc_y' INT NOT NULL,
'br_loc_z' INT NOT NULL,
...
CONSTRAINT 'fk_branch_tree'
FOREIGN KEY ('tree_id' )
REFERENCES `TREE` ('tree_id' )
)
CREATE TABLE 'FLOCK' (
'flock_id' INT NOT NULL AUTO_INCREMENT ,
'name' VARCHAR(45) NOT NULL
...
)
CREATE TABLE 'BIRD' (
'bird_id' INT(11) NOT NULL AUTO_INCREMENT ,
'flock_id' INT(11) NOT NULL ,
'branch_id' INT(11) NULL ,
'bird_tag' VARCHAR(45) NOT NULL ,
...
CONSTRAINT 'fk_bird_flock'
FOREIGN KEY ('flock_id' )
REFERENCES 'FLOCK' ('flock_id' )
CONSTRAINT 'fk_bird_branch'
FOREIGN KEY ('branch_id' )
REFERENCES 'BRANCH' ('branch_id' )
)
我想從C ++應用程序中以批量類型加載(多插入語句或LOAD DATA INFILE)加載每個表。
檢索數據庫分配的auto_increment值以用作隨后的每個表加載的外鍵的最佳方法是什么。
請注意,表不一定必須以級聯方式加載(即BIRDS將在FLOCKS之后而不是BRANCHES之后直接加載,因此“ BLAST_INSERT_ID”對於BRANCHES加載BIRDS不會有用)。
每個表都有候選自然鍵,但我試圖避免將它們用作主鍵或外鍵。
當您使用LOAD DATA INFILE(或其他類似INSERT ... SELECT的多行INSERT)時,對LAST_INSERT_ID()的后續調用僅返回生成的第一個 id值。 但是InnoDB將id分配為一個連續的塊,因此,如果您插入1000行,並且LAST_INSERT_ID()報告1234,那么您知道數據加載使用id的1234到2233。
(假設auto_incrment_increment = 1;如果不是,則更准確地說您的數據加載將使用接下來的1000個連續ID。)
但是,如果您隨后在樹后批量加載分支,則會遇到不知道每個分支屬於哪棵樹的問題。 有些樹可能只有一個分支,有些樹可能只有六個分支,等等。僅僅因為您有1000棵樹和1000個分支,就不一定要假設分布均勻。 如果樹枝上有鳥等,則情況變得更加復雜。
最終,將數據批量加載到多個表中並保留所有相應的生成ID都是不切實際的。 您確實必須編寫代碼來逐行循環遍歷所有輸入文件,並逐行捕獲LAST_INSERT_ID()以在相關行中使用。 我沒有找到更好的解決方案。
對於更復雜的情況,鳥類對它們各自的分支和它們的羊群都有外鍵,您可以嘗試跟蹤每個分支的插入ID,並將其映射到自然鍵,但是也許有太多的分支以至於它將該映射保留在內存中變得不切實際。 在一定的規模,你會發現,你可以選擇插入鳥類插入任何分支機構或成群,但不能同時(因為有分支機構和羊群之間的許多一對多的關系,你不能假設他們那種很好) 。 因此,插入鳥可能涉及為其分支或它們的群保留NULL,然后稍后必須使用UPDATE填充丟失的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.