mysql - таблицы - Настройка внешних ключей в phpMyAdmin?




отсутствует индекс в столбце phpmyadmin (6)

Я настраиваю базу данных с помощью phpMyAdmin. У меня есть две таблицы ( foo и bar ), индексированные по их основным ключам . Я пытаюсь создать реляционную таблицу ( foo_bar ) между ними, используя их первичные ключи как внешние ключи.

Я создал эти таблицы как MyISAM, но с тех пор изменил все три на InnoDB, потому что я читал, что MyISAM не поддерживает внешние ключи. Все поля id - INT(11) .

Когда я выберу таблицу foo_bar , нажмите ссылку «отношение» и попробуйте установить столбцы FK в файл database.foo.id и database.bar.id , в нем говорится: «Без указателей!» рядом с каждой колонкой.

Что мне не хватает?

Осветление / Update

Для простоты я хочу продолжать использовать phpMyAdmin. В настоящее время я использую XAMPP, что достаточно просто, чтобы я мог сосредоточиться на PHP / CSS / Javascript, и он поставляется с phpMyAdmin.

Кроме того, хотя мне еще не удалось установить явные внешние ключи, у меня есть реляционная таблица и вы можете выполнять такие объединения:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Мне просто неудобно не иметь явно определенных в базе данных FK.


InnoDB позволяет добавить новое ограничение внешнего ключа в таблицу с помощью ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

С другой стороны, если MyISAM имеет преимущества перед InnoDB в вашем контексте, почему вы хотите вообще создавать ограничения внешнего ключа. Вы можете справиться с этим на уровне модели вашего приложения. Просто убедитесь, что столбцы, которые вы хотите использовать как внешние ключи, индексируются!


phpMyAdmin позволяет вам определять внешние ключи, используя их «отношения». Но поскольку MySQL поддерживает только внешние ограничения в таблицах «INNO DB», первый шаг - убедиться, что используемые вами таблицы имеют такой тип.

Чтобы настроить внешний ключ, чтобы столбец PID в таблице с именем CHILD ссылался на столбец идентификатора в таблице с именем PARENT, вы можете сделать следующее:

  1. Для обеих таблиц перейдите на вкладку операций и измените их тип на "INNO DB"
  2. Убедитесь, что ID - это первичный ключ (или хотя бы индексированный столбец) таблицы PARENT.
  3. В таблице CHILD определите индекс для столбца PID.
  4. При просмотре закладки структуры таблицы CHILD нажмите ссылку «отношение» непосредственно над секцией «Добавить поля».
  5. Вам будет предоставлена ​​таблица, в которой каждая строка соответствует индексированному столбцу в вашей таблице CLIENT. Первый раскрывающийся список в каждой строке позволяет вам выбрать, какой TABLE-> COLUMN ссылается на индексированный столбец. В строке для PID в раскрывающемся списке выберите PARENT-> ID и нажмите GO.

Выполняя экспорт в таблице CHILD, вы должны увидеть ограничение внешнего ключа для столбца PID.


Для тех, кто связан с базой данных ... и должен ALTER существующую таблицу. Многие вещи кажутся довольно простыми, но всегда есть что-то ... между A и B.

Прежде всего, взгляните на this .

  1. Убедитесь, что у вас есть P_ID (родительский идентификатор на родительской и дочерней таблицах).
  2. Конечно, он будет уже заполнен родителем. Не обязательно в ребенке по-настоящему и окончательно. Так, например, P_ID # 3 (может быть, много раз в дочерней таблице указывается исходный P_ID в родительской таблице).
  3. Перейдите на вкладку SQL (я использую phpMyAdmin, должен быть похож на другие) и выполните следующую команду:

    ALTER TABLE имя дочернего_каталога
    ДОБАВИТЬ ИНОСТРАННЫЙ КЛЮЧ (P_ID)
    ССЫЛКИ parent_table_name (P_ID)

  4. Нажмите на дочернюю таблицу, а не структуру, наконец, на реляционный вид. Завершите планирование БД. Перед этим был хороший ответ о каскаде, ограничении и т. Д. Конечно, это можно сделать с помощью команд ...


Если вы хотите использовать phpMyAdmin для установления отношений, вам нужно сделать 2 вещи. Прежде всего, вам нужно определить индекс в столбце внешнего ключа в ссылочной таблице (так что foo_bar.foo_id, в вашем случае). Затем перейдите к представлению отношения (в ссылочной таблице) и выберите упомянутый столбец (так что в вашем случае foo.id) и действия по обновлению и удалению.

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

EDIT: Убедитесь, что обе таблицы имеют выбранный двигатель InnoDB.


Шаг 1: Вы должны добавить строку: default-storage-engine = InnoDB в разделе [mysqld] вашего конфигурационного файла mysql (my.cnf или my.ini в зависимости от вашей ОС) и перезапустить службу mysqld.

Шаг 2. Теперь, когда вы создаете таблицу, вы увидите, что тип таблицы: InnoDB

Шаг 3: Создайте как родительскую, так и дочернюю таблицу. Теперь откройте таблицу Child и выберите столбец U, чтобы иметь внешний ключ: выберите индексный ключ из метки действия, как показано ниже.

Шаг 4: Теперь откройте вид привязки в той же дочерней таблице снизу рядом с надписью «Печать», как показано ниже.

Шаг 5: Выберите столбец U, чтобы иметь внешний ключ в качестве столбца «Родительский столбец» в раскрывающемся списке. dbName.TableName.ColumnName

Выберите соответствующие значения для ON DELETE и ON UPDATE


Это резюме статьи в Википедии. Он определяет различные типы отношений, которые вы можете указать в PHPmyadmin. Я помещаю его здесь, потому что это имеет отношение к комментарию @ Nathan по настройке параметров внешних ключей для «on update / delete», но слишком велико для комментария - надеюсь, что это поможет.

CASCADE

Всякий раз, когда строки в основной (ссылочной) таблице удаляются (соответственно обновляется), соответствующие строки дочерней (ссылки) таблицы с соответствующим столбцом внешнего ключа будут удалены (соответственно обновлены). Это называется каскадным удалением (соответственно обновлением [2]).

RESTRICT

Значение не может быть обновлено или удалено, если строка существует в таблице внешнего ключа, которая ссылается на значение в ссылочной таблице. Аналогично, строка не может быть удалена, если есть ссылка на нее из таблицы внешнего ключа.

БЕЗДЕЙСТВИЕ

NO ACTION и RESTRICT очень похожи. Основное различие между NO ACTION и RESTRICT заключается в том, что без NO ACTION проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед попыткой выполнить инструкцию UPDATE или DELETE. Оба ссылочных действия действуют одинаково, если проверка ссылочной целостности не выполняется: инструкция UPDATE или DELETE приведет к ошибке.

SET NULL

Значения внешнего ключа в ссылочной строке устанавливаются равными NULL, когда ссылочная строка обновляется или удаляется. Это возможно только в том случае, если соответствующие столбцы в справочной таблице имеют значение NULL. Из-за семантики NULL строка ссылок с NULL в столбцах внешнего ключа не требует ссылочной строки.

УСТАНОВИТЬ ПО УМОЛЧАНИЮ

Аналогично SET NULL значения внешнего ключа в ссылочной строке устанавливаются в столбце по умолчанию, когда ссылочная строка обновляется или удаляется.





phpmyadmin