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


336

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

Ответы:


366

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

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

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


93
Подсказка: представление отношений - это небольшая ссылка под вашей таблицей, мне было трудно найти ее в первую очередь
Младен Янджетович

14
Если эта ссылка там не отображается, в этом случае: убедитесь, что ваша таблица имеет тип InnoDB (на вкладке «Операции» в phpMyAdmin), чтобы этого не произошло.
muttley91

4
@ muttley91 Моя таблица - InnoDB. Я дважды проверил. Ссылка по-прежнему не отображается.
Афилина

6
@afilina В новой версии phpMyAdmin она видна вверху внутри вкладки «Структура», чуть ниже строки вкладок с
надписью

226

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


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

87

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

CASCADE

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

RESTRICT

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

БЕЗДЕЙСТВИЕ

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

SET NULL

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

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

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


1
А еще лучше, перейдите непосредственно к исходной документации MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

63

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

введите описание изображения здесь

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

введите описание изображения здесь

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


17

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

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

  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 *. Сначала установите столбец, для которого вы хотите установить внешний ключ, в качестве индекса.

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

там вы можете найти варианты установки внешнего ключа


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
@ Натан: Это то, что я говорю в посте. Вы можете справиться с этим на уровне модели тоже. Вы можете реализовать удаление каскада из модели.
Markus

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

4

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

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

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


3

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

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

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


2

Сначала установите Storage Engine как InnoDB

Сначала установите Storage Engine как InnoDB

затем включить опцию просмотра отношения в меню структуры

тогда опция просмотра отношения включена


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

2

Это старая ветка, но ответьте, потому что, если это кому-нибудь пригодится.

Шаг 1 . Ваш Db Storage Engine установлен на InnoDB

Шаг 2 . Создать основную таблицу

здесь customerпервичная таблица и customer_idпервичный ключ

введите описание изображения здесь

Шаг 3 . создать таблицу внешнего ключа и дать индекс

здесь мы имеем в customer_addressesкачестве связанной таблицы и храним адреса клиентов, поэтому здесь customer_idсвязь с customerтаблицей

мы можем выбрать индекс непосредственно при создании таблицы, как показано ниже

введите описание изображения здесь

Если вы забыли указать индекс при создании таблицы , вы можете указать индекс на вкладке структуры таблицы, как показано ниже.

введите описание изображения здесь

Шаг 4 . Как только индекс дается в поле, перейдите на вкладку структуры и нажмите на представление отношений, как показано на рисунке ниже

введите описание изображения здесь

Шаг 5 . Теперь выберите ON DELETE и ON UPDATE, что вы хотите сделать, выберите столбец из текущей таблицы, выберите DB (SAME DB), выберите таблицу отношений и первичный ключ из этой таблицы, как показано на рисунке ниже, и сохраните его.

введите описание изображения здесь

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



0

Более новые версии phpMyAdmin больше не имеют опции « Relation View », и в этом случае вам нужно будет выполнить оператор, чтобы достичь того же самого. Например

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

В этом примере, если строка из компаний удаляется, все сотрудники с этим идентификатором компании также удаляются.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.