Я настраиваю базу данных с помощью 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;
Мне просто неудобно, что FK не определены в базе данных в явном виде.
Если вы хотите использовать phpMyAdmin для установки отношений, вы должны сделать две вещи. Во-первых, вы должны определить индекс для столбца внешнего ключа в ссылающейся таблице (в вашем случае foo_bar.foo_id). Затем перейдите к представлению отношения (в ссылающейся таблице) и выберите ссылающийся столбец (в вашем случае foo.id) и действия on update и on delete.
Я думаю, что внешние ключи полезны, если у вас есть несколько таблиц, связанных друг с другом, в частности, ваши скрипты удаления станут очень короткими, если вы правильно установите параметры ссылки.
EDIT: Убедитесь, что для обеих таблиц выбран движок InnoDB.
phpMyAdmin позволяет вам определять внешние ключи с помощью представления "отношения". Но поскольку MySQL поддерживает внешние ограничения только для таблиц "INNO DB", первый шаг - убедиться, что используемые вами таблицы относятся к этому типу.
Чтобы установить внешний ключ, чтобы столбец PID в таблице с именем CHILD ссылался на столбец ID в таблице с именем PARENT, вы можете сделать следующее:
Выполнив экспорт таблицы CHILD, вы должны увидеть, что для столбца PID было создано ограничение внешнего ключа.
Это краткое изложение статьи в Википедии. Он указывает на разные типы отношений можно установить в phpmyadmin. Я поставил ее здесь, потому что это имеет отношение к @Натан'ы прокомментировать настройка внешних ключей варианты "на обновление/удаление" но слишком большой для комментария - надеюсь, что это помогает.
Каскад
Всякий раз, когда строки в мастер (справочные) таблицы удаляются (респ. обновлены), в соответствующих строках ребенка (реферирование) стол с соответствующим столбец внешнего ключа будут удалены (респ. обновлены) также. Это называется каскадное удаление (респ. обновления[2]).
Ограничения
Значение не может быть обновлена или удалена, когда существует строку в таблице внешнего ключа, который ссылается на значение в связанной таблице. Аналогично, строка не может быть удален, пока есть ссылки на него из внешнего ключа таблицы.
НИЧЕГО НЕ ДЕЛАТЬ
Никаких действий и ограничения очень похожи. Основное различие между никаких действий и ограничения заключается в том, что без действия ссылочной целостности проверка проводится после попытки изменить таблице. Ограничивать ли проверить, прежде чем пытаться выполнить Update или Delete. Оба ссылочных действий действовать так же, если ссылочная целостность проверить не: Update или Delete приведет к ошибке.
УСТАНОВИТЬ ЗНАЧЕНИЕ NULL
Значения внешнего ключа в ссылающейся строк имеет значение null, когда ссылочная строка обновляется или удаляется. Это возможно только в том случае, если соответствующие столбцы в ссылающейся таблице значение null. Семантика значение null, ссылающейся строки с null в столбцы внешних ключей не требует соответствующей строки.
ПО УМОЛЧАНИЮ
Аналогично установить значение NULL, значения внешнего ключа в ссылающейся строке столбца по умолчанию при указанной строки будут обновлены или удалены.
В phpmyadmin, вы можете присвоить внешнему ключу, просто его GUI. Нажмите на столе и перейдите на вкладку структура. найти вид связи только ниже таблицы (см. ниже изображения).
Вы можете назначить ковка ключ из списка рядом с первичным ключом.(См. рисунок ниже). и сохранить
соответствующий SQL-запросов автоматически генерируется и выполняется.
Для тех, кто новичок в базе данных .... и нужно изменять существующую таблицу. Многие вещи, казалось бы, довольно проста, но всегда есть что-то ... между A и B.
Прежде всего, взгляните на это.
Изменение таблицы child_table_name ДОБАВИТЬ ВНЕШНИЙ КЛЮЧ (P_ID) Ссылки parent_table_name (P_ID)
Внешний ключ означает не премьер-атрибут таблицы ссылается премьер-атрибут другого в 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 вы'll получить следующее сообщение об ошибке:
Ошибка при создании внешнего ключа на [під колонки] (проверьте типы данных)
Шаг 1: Вы должны добавить строку: по умолчанию-накопитель-двигатель = InnoDB в под [mysqld] файла в MySQL конфиг (мой.CNF или My.ini-файл в зависимости от вашей ОС) и перезапустить службу тузды.
Шаг 2: Теперь, когда вы создаете таблицу вы увидите тип таблицы: InnoDB в
Шаг 3: Создайте обоих родителей и ребенка таблица. Теперь откройте дочернюю таблицу и выберите столбец U как для внешнего ключа: Выберите индекс ключа от метку действий, как показано ниже.
Шаг 4: Теперь откройте представление в отношении одного и того же ребенка таблице снизу возле окна предварительного просмотра, как показано ниже.
Шаг 5: Выберите столбец U как иметь внешний ключ, Как выбрать родительского столбца из выпадающего. имя_бд.Имятаблицы.Имя_столбца
Выберите соответствующие значения на удаление и на обновление
Из официальной документации на https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html][1]:
MySQL требует индексы на внешние ключи и ссылки ключи, так что внешнего ключа проверки могут быть быстро и не требует сканирования таблицы.
Это старый нить, но ответа, потому что если бы полезна для всех.
Шаг 1. Двигатель хранилища БД установлен в InnoDB в
Шаг 2. Создать Главную Таблицу
здесь "клиент" является основной таблице и идентификатора customer_id` - это первичный ключ
Шаг 3. создать внешний ключ в таблице и дать индекс
здесь мы имеем customer_addresses
как связанной таблице и хранить адреса клиентов, поэтому здесь идентификатора customer_idсвязь с
клиента` таблица
мы можем выбрать "индекс" непосредственно при создании таблицы, как показано ниже
Если вы забыли дать индекс при Создание таблицы, то вы можете дать индекс от структура на вкладке таблица, как показано ниже.
Шаг 4. Как только индекс в поле, перейти на вкладку состав и нажать на вид связи, как показано ниже Рис
Шаг 5. Теперь выбираем на Удалить и обновить то, что вы хотите сделать, Выберите столбец из текущей таблицы, выберите БД (тот же БД), выберите отношении таблицы и первичный ключ этой таблицы, как показано ниже PIC и сохранить он
Теперь проверить, если отношения дают успешно, перейти к списку внешних данных в таблице и нажмите на значение внешнего ключа, вы будете перенаправлены на первичную запись в таблице, то относительно успешно.