7

これは私がやろうとしていることです:

私は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, CONSTRAINT parent_ibfk_1FOREIGN KEY ( id) REFERENCES child( parent_id))

子テーブルに参照されたレコードが見つからないために失敗することを理解しています。子テーブルにレコードを作成することから始めて、parent_id を 1 に設定し、次に親テーブルの自動インクリメント カウンタをリセットすると (次の挿入で id = 1 になるように)、うまくいきます! しかし、それは解決策ではありません。

子テーブルに関連する行がない場合、挿入ブロックのユーティリティは表示されません...

一対多の関係を作ろうとしているだけです...

(JOINを使用できることはわかっていますが、データの整合性のために、またPHPのメタデータとして、テーブルリレーションを使用しようとしています)

4

2 に答える 2

11

参照テーブルと参照テーブルが逆になっているようです。あなたがしたいかもしれません:

ALTER TABLE `child ` ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`);

CREATE TABLE次のように、ステートメントで外部キーを定義することもできます。

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`),
  FOREIGN KEY (`parent_id`) REFERENCES `parent`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

テストケース:

INSERT INTO parent (`data`) VALUES ('test data 1');
Query OK, 1 row affected (0.01 sec)

INSERT INTO parent (`data`) VALUES ('test data 2');
Query OK, 1 row affected (0.01 sec)

INSERT INTO child (`parent_id`, `related_ids`) VALUES (1, 100);
Query OK, 1 row affected (0.01 sec)

INSERT INTO child (`parent_id`, `related_ids`) VALUES (2, 100);
Query OK, 1 row affected (0.01 sec)

INSERT INTO child (`parent_id`, `related_ids`) VALUES (3, 100);
ERROR 1452 (23000): Cannot add or update a child row: 
  a foreign key constraint fails 
于 2010-08-23T02:19:47.843 に答える
1

ええと...私はそれを逆にしたと思います。次のように、子テーブルに外部キーを追加する必要があるようです。

ALTER TABLE `child` ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`);

MySQL の用語を扱うのに苦労しています。私を責めることができますか?

于 2010-08-23T02:23:21.453 に答える