4

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

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

И с ошибкой:

Cannot add or update a child row: a foreign key constraint fails (anacorbero . parent , CONSTRAINT parent_ibfk_1 FOREIGN KEY (id) REFERENCES child (parent_id))

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

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

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

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

ответ

8

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

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 
+0

+1: Я понял, что неправильно понял вопрос, когда прочитал ваш ответ. –

+0

Спасибо за быстрый ответ. Я сам это понял! – Rolf

+0

Я уже определил идентификатор в SQL Server 2012, но я пытаюсь передать некоторое значение db. Итак, в этом месте (с автоинкрементами), что мне нужно пройти? –

1

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

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

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

+1

Я рад, что вы поняли, в чем проблема. Если вы думаете об этом, это не так сложно понять. Внешним ключом является ** ограничение **.И вы добавите ограничение в таблицу «child», потому что поле «parent» таблицы «child» будет ограничено в принятии значения, только если это значение существует в столбце 'id'' parent' Таблица. –

Смежные вопросы