Как использовать автоматически увеличивающийся первичный ключ как внешний ключ?

Это то, что я пытаюсь сделать:

У меня есть 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";

И он не с ошибкой:

Невозможно добавить или обновить дочернюю строку: a ограничение внешнего ключа не выполняется (anacorbero. parent, CONSTRAINT parent_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (id) ССЫЛКИ child (parent_id))

Я понимаю, что он терпит неудачу, потому что он не находит записанную запись в дочерней таблице. Если я начну с создания записи в дочерней таблице, установите ее parent_id равным 1, а затем reset счетчик автоинкремента родительской таблицы (так что следующая вставка будет иметь id = 1), она работает! Но это не решение.

Я не вижу полезности блокировки вставки, если в дочерней таблице нет связанной строки...

Я просто пытаюсь сделать отношения "один ко многим"...

(Я знаю, что могу использовать JOIN, но я пытаюсь использовать отношения таблиц, для целостности данных, а также как метаданные для PHP)

2 ответа

Похоже, что вы ссылаетесь и ссылаетесь на таблицы в обратном порядке. Вы можете сделать:

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


Э-э... Я думаю, что я получил это назад. Кажется, что мне нужно добавить внешний ключ к дочерней таблице, например:

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

Мне сложно работать с терминологией MySQL. Можете ли вы обвинить меня?

licensed under cc by-sa 3.0 with attribution.