Настройка внешних ключей в phpMyAdmin?

312

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

Теги:
phpmyadmin

10 ответов

344
Лучший ответ

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

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

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

  • 85
    Подсказка: представление отношений - это небольшая ссылка под вашей таблицей, мне было трудно найти ее в первую очередь.
  • 14
    Если эта ссылка там не отображается, в этом случае: убедитесь, что ваша таблица имеет тип InnoDB (на вкладке «Операции» в phpMyAdmin), чтобы этого не произошло.
Показать ещё 3 комментария
202

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

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

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

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

  • 1
    Вау, очень важная вещь, чтобы знать. Эта страница была не первой, которую я нашел, когда искал помощи в добавлении внешнего ключа, я хотел бы, чтобы об этом упоминалось чаще.
72

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

CASCADE

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

RESTRICT

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

БЕЗДЕЙСТВИЕ

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

SET NULL

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

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

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

51

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

Изображение 847

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

Изображение 848

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

12

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

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

  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

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

  • 4
    Ограничения по внешнему ключу избавляют меня от больших усилий и потенциальных ошибок. Например, допустим, я собираюсь удалить пользователя из моей системы. Я мог бы написать код, который определяет каждое место в базе данных, где существуют данные об этом пользователе, и сказать ему, чтобы удалить его. Но мне нужно постоянно обновлять эту функцию удаления. С другой стороны, если все данные, относящиеся к пользователю, имеют FK для идентификатора пользователя и установлены каскадно при удалении, весь мой код должен сказать «удалить этого пользователя», и база данных позаботится об удалении всего, что имеет ссылка FK на этого пользователя. Гораздо чище поддерживать.
  • 1
    @ Натан: Это то, что я говорю в посте. Вы можете справиться с этим на уровне модели тоже. Вы можете реализовать каскад на удаление из модели.
Показать ещё 1 комментарий
4

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

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

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

2

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

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

Изображение 850

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

Изображение 851

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

Изображение 852 Шаг 5: Выберите столбец U, чтобы иметь внешний ключ в качестве столбца "Выбрать родительский элемент" в раскрывающемся списке. dbName.TableName.ColumnName

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню