これは私がやろうとしていることです:
私は2つのテーブルを持っています...
CREATE TABLE `parent` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `child` (
`parent_id` int(11) DEFAULT NULL,
`related_ids` int(11) DEFAULT NULL,
KEY `parent_id` (`parent_id`),
KEY `related_ids` (`related_ids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
そして、制約:
ALTER TABLE `parent` ADD FOREIGN KEY (`id`) REFERENCES `child` (`parent_id`);
ご覧のとおり、テーブルの親には自動インクリメントされた主キー「id」があり、これは子テーブルの外部キーとしても使用されています。
次のように、親テーブルにレコードを挿入します。
INSERT INTO parent SET DATA="abc";
そして、それはエラーで失敗します:
子行を追加または更新できません: 外部キー制約が失敗しました (
myschema
.parent
, CONSTRAINTparent_ibfk_1
FOREIGN KEY (id
) REFERENCESchild
(parent_id
))
子テーブルに参照されたレコードが見つからないために失敗することを理解しています。子テーブルにレコードを作成することから始めて、parent_id を 1 に設定し、次に親テーブルの自動インクリメント カウンタをリセットすると (次の挿入で id = 1 になるように)、うまくいきます! しかし、それは解決策ではありません。
子テーブルに関連する行がない場合、挿入ブロックのユーティリティは表示されません...
一対多の関係を作ろうとしているだけです...
(JOINを使用できることはわかっていますが、データの整合性のために、またPHPのメタデータとして、テーブルリレーションを使用しようとしています)