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


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

Я создал эти таблицы как MyISAM, но с тех пор изменил все три на InnoDB, потому что я читал, что MyISAM не поддерживает внешние ключи. Все id поля 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 282

9 ответов:

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

каскад

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

ограничения

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

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

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

УСТАНОВИТЬ NULL

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

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

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

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

enter image description here

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

enter image description here

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

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

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

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

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

затем нажмите на представление отношения

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

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: Вы должны добавить строку: default-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 как иметь внешний ключ, Как выбрать Родительский столбец из выпадающего списка. имя_бд.Имя таблицы.Имя_столбца

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