2016-01-08 3 views
1

Я работаю над установкой отношения внешних ключей между двумя таблицами в phpMyAdmin на моем сервере cPanel - я просто назову их «родителями» и «дочерними», чтобы все было просто. В дочерней таблице у меня есть столбец parent_id, который я хочу заполнить номерами идентификаторов из родительской таблицы. Я следил за несколькими учебниками по этому вопросу, но он просто не работает - новые записи создаются, но столбец parent_id на дочерней таблице остается NULL.phpMyAdmin - внешний ключ не работает

Данные формы html передаются на PHP, который вставляет данные в две отдельные таблицы, родительские и дочерние, в одном и том же действии. Родительские и дочерние таблицы по сути являются дубликатами, но в будущем я, вероятно, буду добавлять дополнительные дочерние таблицы, следовательно, потребность в отношении внешних ключей - в основном, в мастер-таблице с несвязанными локальными таблицами.

В phpMyAdmin я установил механизм хранения как родительских, так и дочерних таблиц в InnoDB. В дочерней таблице я добавил столбец parent_id, установил по умолчанию значение NULL и допустил NULL. Затем я проиндексировал этот столбец и установил ограничение внешнего ключа на «parent». 'ID'. phpMyAdmin автоматически генерирует имя ограничения, 'child_ibfk_1'. ON DELETE и ON UPDATE установлены на каскад.

Когда я создаю новую запись, обе таблицы заполняются правильно, но столбец parent_id в дочерней таблице имеет значение NULL, а не идентификатор родителя.

Может ли кто-нибудь увидеть, что я делаю неправильно здесь? Огромное спасибо.

Edit - PHP вставка заявление:

$sql = "INSERT INTO parent (date, time, latitude, longitude, accuracy, species, deadinjured, sex, age, name, contact_info, notes, source) 
VALUES ('$date', '$time', '$latitude', '$longitude', '$accuracy', '$species', '$deadinjured', '$sex', '$age', '$name', '$contact_info', '$notes', 'source 1');"; 

$sql .= "INSERT INTO child (date, time, latitude, longitude, accuracy, species, deadinjured, sex, age, name, contact_info, notes) 
VALUES ('$date', '$time', '$latitude', '$longitude', '$accuracy', '$species', '$deadinjured', '$sex', '$age', '$name', '$contact_info', '$notes');"; 
+1

'Когда я создаю новую запись, обе таблицы заполняются правильно'. Можем ли мы увидеть точные запросы/запросы, которые вы выполняете? – Nate

+0

Вперед - я отредактирую их в свой первоначальный вопрос. – skwidbreth

+1

Вы должны явно указать родительский идентификатор в команде 'INSERT', которая вставляет в дочернюю таблицу. Вы можете получить идентификатор родительской записи сразу после ее добавления с помощью соответствующей функции API: например. ['mysql_insert_id()'] (https://secure.php.net/manual/en/function.mysql-insert-id.php), ['mysqli :: $ insert_id'] (https: //secure.php .net/manual/en/mysqli.insert-id.php), ['PDO :: lastInsertId'] (https://secure.php.net/manual/en/pdo.lastinsertid.php) и т. д. – eggyal

ответ

2

Проблема здесь в том, что вам нужно вручную связать child записи с соответствующей записью в таблице parent, по в явном виде установка значения child.parent_id. Ограничение внешнего ключа служит только для соблюдения правила, которое гласит: «Когда значение добавляется к child.parent_id, оно должно соответствовать значению в parent.id».

Кроме того, каскады ON UPDATE и ON DELETE будут работать только после того, как вы установили значение child.parent_id.

+0

Ах, я понимаю! Большое спасибо. – skwidbreth

+0

Нет проблем! И, как описано eggyal, вы можете легко получить новое значение 'parent.id', чтобы затем вставить его в' child.parent_id'. – Nate

+0

Да, вы, ребята, прибили его. – skwidbreth

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