Настройка внешних ключей в phpMyAdmin? - PullRequest
316 голосов
/ 20 января 2009

Я настраиваю базу данных с помощью 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, явно определенные в базе данных.

Ответы [ 10 ]

344 голосов
/ 26 сентября 2009

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

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

РЕДАКТИРОВАТЬ: убедитесь, что в обеих таблицах выбран механизм InnoDB.

219 голосов
/ 05 июня 2011

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 создано ограничение внешнего ключа.

80 голосов
/ 10 августа 2012

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

CASCADE

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

RESTRICT

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

НЕТ ДЕЙСТВИЙ

НЕТ ДЕЙСТВИЙ и ОГРАНИЧЕНИЯ очень похожи. Основное различие между NO ACTION и RESTRICT заключается в том, что при NO ACTION проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед попыткой выполнения оператора UPDATE или DELETE. Оба ссылочных действия действуют одинаково, если проверка ссылочной целостности завершается неудачно: инструкция UPDATE или DELETE приведет к ошибке.

SET NULL

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

SET DEFAULT

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

54 голосов
/ 28 июля 2015

В phpmyadmin вы можете назначить внешний ключ просто через его графический интерфейс. Нажмите на таблицу и перейдите на вкладку Структура. найдите Relation View только ниже таблицы (показано на рисунке ниже).

enter image description here

Вы можете назначить ключ ковки из списка рядом с первичным ключом (см. Изображение ниже). и сохранить

enter image description here

соответствующий SQL-запрос автоматически генерируется и выполняется.

14 голосов
/ 07 сентября 2013

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

Прежде всего посмотрите на .

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

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
    
  4. Щелкните по дочерней таблице, затем по структуре, наконец, по реляционному представлению. Завершите планирование БД там. Перед этим был хороший ответ о каскаде, ограничении и т. Д. Конечно, это можно сделать командами ...

9 голосов
/ 25 ноября 2013

Внешний ключ означает, что непростой атрибут таблицы ссылается на основной атрибут другого * в phpMyAdmin * сначала установите столбец, для которого вы хотите установить внешний ключ в качестве индекса

затем нажмите на ОТНОШЕНИЕ СВЯЗИ

там вы можете найти опции для установки внешнего ключа

7 голосов
/ 21 января 2009

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

4 голосов
/ 14 декабря 2011

Не забывайте, что два столбца должны иметь одинаковый тип данных.

например, если один столбец имеет тип INT, а другой - тип tinyint, вы получите следующую ошибку:

Ошибка создания внешнего ключа для [столбец PID] (проверьте типы данных)

3 голосов
/ 06 сентября 2017

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

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

enter image description here

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

enter image description here

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

enter image description here Шаг 5: Выберите столбец U, который хотите иметь Внешний ключ как Выбрать родительский столбец из раскрывающегося списка. dbName.TableName.ColumnName

Выберите подходящие значения для ON DELETE и ON UPDATE enter image description here

0 голосов
/ 15 декабря 2018

Из официальной документации MySQL на https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...