考虑以下人为设计的示例,其中FOREST包含TREE (s) 并且TREE (s) 具有BRANCH (es)。此外FLOCK (s) 包含BIRD (s) 并且BIRD (s) 可能在也可能不在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 之后加载,因此“LAST_INSERT_ID”在相对于 BRANCHES 加载 BIRDS 时没有用)。
每个表都有候选自然键,但我试图避免将它们用作主键或外键。