Как использовать автоматически увеличенный первичный ключ в качестве внешнего ключа? - PullRequest
5 голосов
/ 23 августа 2010

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

У меня есть 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", который также используется в качестве внешнего ключа для дочерней таблицы.

Теперь я хочу вставить запись в родительскую таблицу, напримерthis:

INSERT INTO parent SET DATA="abc";

И происходит ошибка с ошибкой:

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 23 августа 2010

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

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 
1 голос
/ 23 августа 2010

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

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

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

...