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 は BRANCHES の直後ではなく FLOCKS の後にロードされるため、BRANCHES に関して BIRDS をロードする場合、「LAST_INSERT_ID」は役に立ちません)。
各テーブルには自然キーの候補がありますが、それらを主キーまたは外部キーとして使用しないようにしています。