Я настраиваю базу данных с помощью 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 позволяет вам определять внешние ключи, используя их представление "отношения". Но поскольку MySQL поддерживает только внешние ограничения для таблиц «INNO DB», первый шаг - убедиться, что используемые вами таблицы относятся к этому типу.
Чтобы настроить внешний ключ так, чтобы столбец PID в таблице с именем CHILD ссылался на столбец идентификатора в таблице с именем PARENT, вы можете сделать следующее:
Выполнив экспорт в таблицу CHILD, вы увидите, что для столбца PID создано ограничение внешнего ключа.
источник
Это краткое изложение статьи в Википедии. Он определяет различные типы отношений, которые вы можете установить в PHPmyadmin. Я помещаю это здесь, потому что это имеет отношение к комментарию @ Натана об установке параметров внешних ключей для «при обновлении / удалении», но слишком велик для комментария - надеюсь, это поможет.
CASCADE
Всякий раз, когда строки в главной (ссылочной) таблице удаляются (соответственно обновляются), соответствующие строки дочерней (ссылающейся) таблицы с соответствующим столбцом внешнего ключа также удаляются (соответственно обновляются). Это называется каскадным удалением (соответственно update [2]).
RESTRICT
Значение не может быть обновлено или удалено, если в таблице внешнего ключа существует строка, которая ссылается на значение в ссылочной таблице. Аналогичным образом, строка не может быть удалена, пока есть ссылка на нее из таблицы внешнего ключа.
БЕЗДЕЙСТВИЕ
НЕТ ДЕЙСТВИЙ и ОГРАНИЧЕНИЯ очень похожи. Основное различие между NO ACTION и RESTRICT состоит в том, что при NO ACTION проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед попыткой выполнить инструкцию UPDATE или DELETE. Оба ссылочных действия действуют одинаково в случае сбоя проверки ссылочной целостности: оператор UPDATE или DELETE приведет к ошибке.
SET NULL
Значения внешнего ключа в ссылочной строке устанавливаются в NULL, когда ссылочная строка обновляется или удаляется. Это возможно только в том случае, если соответствующие столбцы в ссылочной таблице обнуляются. Из-за семантики NULL для ссылочной строки с NULL в столбцах внешнего ключа не требуется ссылочная строка.
УСТАНОВИТЬ ПО УМОЛЧАНИЮ
Подобно SET NULL, значения внешнего ключа в ссылочной строке устанавливаются в столбец по умолчанию при обновлении или удалении ссылочной строки.
источник
В phpmyadmin вы можете назначить внешний ключ просто через его графический интерфейс. Нажмите на таблицу и перейдите на вкладку Структура. найдите Relation View только ниже таблицы (показано на рисунке ниже).
Вы можете назначить ключ ковки из списка рядом с первичным ключом (см. Изображение ниже). и сохранить
соответствующий SQL-запрос автоматически генерируется и выполняется.
источник
Для новичков в базе данных .... и нужно изменить существующую таблицу. Многие вещи кажутся довольно простыми, но всегда есть что-то ... между А и Б.
Прежде всего, взгляните на это .
Перейдите на вкладку SQL (я использую phpMyAdmin, должен быть похож на другие) и выполните эту команду:
Нажмите на дочернюю таблицу, затем структуру, наконец, на реляционном представлении. Завершите планирование БД там. До этого был хороший ответ о каскаде, ограничении и т. Д. Конечно, это можно сделать командами ...
источник
Внешний ключ означает, что непростой атрибут таблицы ссылается на основной атрибут другого * в phpMyAdmin *. Сначала установите столбец, для которого вы хотите установить внешний ключ, в качестве индекса.
затем нажмите на ОТНОШЕНИЕ СВЯЗИ
там вы можете найти варианты установки внешнего ключа
источник
InnoDB позволяет вам добавить новое ограничение внешнего ключа в таблицу, используя ALTER TABLE:
С другой стороны, если MyISAM имеет преимущества перед InnoDB в вашем контексте, зачем вам вообще создавать ограничения внешнего ключа. Вы можете справиться с этим на уровне модели вашего приложения. Просто убедитесь, что столбцы, которые вы хотите использовать в качестве внешних ключей, проиндексированы!
источник
Не забывайте, что два столбца должны иметь одинаковый тип данных.
например, если один столбец имеет тип INT, а другой - тип tinyint, вы получите следующую ошибку:
Ошибка создания внешнего ключа в столбце [PID] (проверьте типы данных)
источник
Шаг 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
источник
Сначала установите Storage Engine как InnoDB
затем включить опцию просмотра отношения в меню структуры
источник
Это старая ветка, но ответьте, потому что, если это кому-нибудь пригодится.
Шаг 1 . Ваш Db Storage Engine установлен на InnoDB
Шаг 2 . Создать основную таблицу
здесь
customer
первичная таблица иcustomer_id
первичный ключШаг 3 . создать таблицу внешнего ключа и дать индекс
здесь мы имеем в
customer_addresses
качестве связанной таблицы и храним адреса клиентов, поэтому здесьcustomer_id
связь сcustomer
таблицеймы можем выбрать индекс непосредственно при создании таблицы, как показано ниже
Если вы забыли указать индекс при создании таблицы , вы можете указать индекс на вкладке структуры таблицы, как показано ниже.
Шаг 4 . Как только индекс дается в поле, перейдите на вкладку структуры и нажмите на представление отношений, как показано на рисунке ниже
Шаг 5 . Теперь выберите ON DELETE и ON UPDATE, что вы хотите сделать, выберите столбец из текущей таблицы, выберите DB (SAME DB), выберите таблицу отношений и первичный ключ из этой таблицы, как показано на рисунке ниже, и сохраните его.
Теперь проверьте, успешно ли даны отношения, перейдите к списку данных сторонних таблиц и нажмите на значение внешнего ключа, вы перенаправитесь к записи первичной таблицы, после чего связь установится успешно.
источник
Из официальной документации MySQL по адресу https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
источник
Более новые версии phpMyAdmin больше не имеют опции « Relation View », и в этом случае вам нужно будет выполнить оператор, чтобы достичь того же самого. Например
В этом примере, если строка из компаний удаляется, все сотрудники с этим идентификатором компании также удаляются.
источник