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

я настраиваю базу данных с помощью phpMyAdmin. У меня две таблицы (foo и bar),индексируется на их первичных ключах. Я пытаюсь создать реляционную таблицу (foo_bar) между ними, через их первичные ключи в качестве внешних ключей.

Я создал эти таблицы как MyISAM, но с тех пор изменил все три на InnoDB, потому что я прочитал, что MyISAM не поддерживает внешние ключи. Все!--4--> поля INT(11).

когда я выбираю foo_bar таблица, нажмите на ссылку "Просмотр отношений" и попробуйте установить столбцы FK как database.foo.id и database.bar.id, он скажет "индекс не определен!" рядом с каждой колонкой.

что я упустил?

Уточнение/Обновление

для простоты я хочу продолжать использовать 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;

мне просто неудобно не иметь FKS, явно определенного в базе данных.

9 ответов


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

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

EDIT: убедитесь,что в обеих таблицах выбран движок InnoDB.


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

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

  1. для обеих таблиц перейдите на вкладку Операции и измените их тип на " INNO DB"
  2. убедитесь, что ID является первичным ключом (или, по крайней мере, индексированным столбцом) родительской таблицы.
  3. в дочерней таблице определите индекс для столбца PID.
  4. при просмотре вкладки структура дочерней таблицы щелкните ссылку " вид связи "чуть выше раздела" добавить поля".
  5. вам будет предоставлена таблица, где каждая строка соответствует индексированному столбцу в вашей клиентской таблице. Первый раскрывающийся список в каждой строке позволяет выбрать, какая таблица- > столбец ссылки на индексированные столбцы. В строке для PID выберите PARENT - >ID из раскрывающегося списка и нажмите GO.

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


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

каскад

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

ограничения

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

НИКАКИХ ДЕЙСТВИЙ

никаких действий и ограничений очень похожи. Основное различие между no ACTION и RESTRICT заключается в том, что без действия проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед выполнением инструкции UPDATE или DELETE. Оба ссылочных действия действуют одинаково, если проверка ссылочной целостности завершается неудачно: инструкция UPDATE или DELETE приведет к ошибке.

УСТАНОВИТЬ NULL

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

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

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


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

enter image description here

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

enter image description here

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


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

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

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

    ALTER TABLE child_table_name
    ДОБАВИТЬ ВНЕШНИЙ КЛЮЧ (P_ID)
    Ссылки parent_table_name (P_ID)

  4. нажмите на дочернюю таблицу, чем структура, наконец, на реляционный вид. Завершите планирование БД там. До этого был хороший ответ одно о каскаде, ограничивает, etc. Конечно, это можно было сделать по команде...


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

затем нажмите на RELATION VIEW

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


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


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

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

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


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

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

enter image description here

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

enter image description here

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

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

выберите соответствующие значения для ON DELETE и ON ОБНОВЛЕНИЕ enter image description here