Настройка внешних ключей в phpMyAdmin?
Я создаю базу данных с помощью 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 в базе данных.
Ответы
Ответ 1
Если вы хотите использовать phpMyAdmin для установления отношений, вам нужно сделать 2 вещи. Прежде всего, вам нужно определить индекс в столбце внешнего ключа в ссылочной таблице (так что foo_bar.foo_id, в вашем случае). Затем перейдите к представлению отношения (в ссылочной таблице) и выберите соответствующий столбец (так что в вашем случае foo.id) и действия по обновлению и удалению.
Я думаю, что внешние ключи полезны, если у вас несколько таблиц, связанных друг с другом, в частности, ваши скрипты удаления станут очень короткими, если вы правильно установите параметры ссылок.
РЕДАКТИРОВАТЬ: Убедитесь, что обе таблицы имеют выбранный двигатель InnoDB.
Ответ 2
phpMyAdmin позволяет вам определять внешние ключи, используя их "отношения". Но поскольку MySQL поддерживает только внешние ограничения в таблицах "INNO DB", первый шаг состоит в том, чтобы убедиться, что используемые вами таблицы имеют такой тип.
Чтобы настроить внешний ключ, чтобы столбец PID в таблице с именем CHILD ссылался на столбец идентификатора в таблице с именем PARENT, вы можете сделать следующее:
- Для обеих таблиц перейдите на вкладку операций и измените их тип на "INNO DB"
- Убедитесь, что идентификатор - это первичный ключ (или, по крайней мере, индексированный столбец) таблицы PARENT.
- В таблице CHILD определите индекс для столбца PID.
- При просмотре закладки структуры таблицы CHILD нажмите ссылку "отношение" непосредственно над разделом "добавить поля".
- Вам будет предоставлена таблица, в которой каждая строка соответствует индексированному столбцу в вашей таблице CLIENT. Первый раскрывающийся список в каждой строке позволяет вам выбрать, какой TABLE- > COLUMN ссылается на индексированный столбец. В строке для PID в раскрывающемся списке выберите PARENT- > ID и нажмите GO.
Выполняя экспорт в таблице CHILD, вы должны увидеть, что для столбца PID было создано ограничение внешнего ключа.
Ответ 3
Это краткое изложение статьи в Википедии. Он определяет различные типы отношений, которые вы можете установить в PHPmyadmin. Я помещаю это здесь, потому что это относится к комментарию @Nathan по установке параметров внешних ключей для "при обновлении/удалении", но слишком велик для комментария - надеюсь, это поможет.
CASCADE
Всякий раз, когда строки в основной (ссылающейся) таблице удаляются (соответственно обновляются), соответствующие строки дочерней (ссылающейся) таблицы с соответствующим столбцом внешнего ключа также удаляются (соответственно обновляются). Это называется каскадным удалением (соответственно update [2]).
RESTRICT
Значение не может быть обновлено или удалено, если в таблице внешнего ключа существует строка, которая ссылается на значение в ссылочной таблице. Аналогичным образом, строка не может быть удалена, пока есть ссылка на нее из таблицы внешнего ключа.
БЕЗДЕЙСТВИЕ
НЕТ ДЕЙСТВИЙ и ОГРАНИЧЕНИЯ очень похожи. Основное различие между NO ACTION и RESTRICT заключается в том, что при NO ACTION проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед попыткой выполнения оператора UPDATE или DELETE. Оба ссылочных действия действуют одинаково в случае сбоя проверки ссылочной целостности: оператор UPDATE или DELETE приведет к ошибке.
SET NULL
Значения внешнего ключа в ссылочной строке устанавливаются в NULL, когда ссылочная строка обновляется или удаляется. Это возможно только в том случае, если соответствующие столбцы в ссылочной таблице обнуляются. Из-за семантики NULL для ссылочной строки с NULL в столбцах внешнего ключа не требуется ссылочная строка.
УСТАНОВИТЬ ПО УМОЛЧАНИЮ
Как и в случае SET NULL, значения внешнего ключа в ссылочной строке устанавливаются в столбец по умолчанию при обновлении или удалении ссылочной строки.
Ответ 4
В phpmyadmin вы можете назначить внешний ключ просто своим графическим интерфейсом. Нажмите на таблицу и перейдите на вкладку "Структура". найдите вид соответствия только внизу таблицы (показано на рисунке ниже).
![введите описание изображения здесь]()
Вы можете назначить ключ штамповки из списка рядом с первичным ключом (см. рисунок ниже). и сохраните
![введите описание изображения здесь]()
соответствующий SQL-запрос автоматически сгенерирован и выполнен.
Ответ 5
Для новичков в базе данных.... и нужно изменить существующую таблицу. Многие вещи кажутся довольно простыми, но всегда есть что-то... между А и В.
Прежде всего, взгляните на это.
- Убедитесь, что у вас есть P_ID (родительский идентификатор в родительской и дочерней таблицах).
- Конечно, это будет уже заполнено в родительском. Не обязательно у ребенка в истинной и окончательной форме. Так, например, P_ID # 3 (возможно, много раз в дочерней таблице будет указываться на исходный P_ID в родительской таблице).
-
Перейдите на вкладку SQL (я использую phpMyAdmin, должен быть похож на другие) и выполните следующую команду:
ALTER TABLE child_table_name
ADD FOREIGN KEY (P_ID)
REFERENCES parent_table_name (P_ID)
-
Кликните по дочерней таблице, затем по структуре, наконец, по реляционному виду. Завершите планирование БД там. До этого был хороший ответ о каскаде, ограничении и т.д. Конечно, это можно сделать командами...
Ответ 6
Внешний ключ означает, что не первичный атрибут таблицы ссылается на первичный атрибут другого
* в phpMyAdmin * сначала установите столбец, который вы хотите установить для внешнего ключа как индекс
затем нажмите ссылку RELATION VIEW
там u может найти параметры для установки внешнего ключа
Ответ 7
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 в вашем контексте, почему вы хотите вообще создавать ограничения внешнего ключа. Вы можете справиться с этим на уровне модели вашего приложения. Просто убедитесь, что столбцы, которые вы хотите использовать как внешние ключи, индексируются!
Ответ 8
Не забывайте, что оба столбца должны иметь одинаковый тип данных.
например, если один столбец имеет тип INT, а другой имеет тип tinyint, вы получите следующую ошибку:
Ошибка создания внешнего ключа в [столбце PID] (проверьте типы данных)
Ответ 9
Шаг 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
![введите описание изображения здесь]()
Ответ 10
Из официальной документации MySQL по адресу https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html:
MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы.
Ответ 11
Сначала установите Storage Engine как InnoDB
![First set Storage Engine as InnoDB]()
затем включите опцию отношения просмотра в меню структуры
![then the relation view option enable]()