Настройка внешних ключей в 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

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

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

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

Ответ 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