Я создаю базу данных с помощью 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 для установления отношений, вам нужно сделать 2 вещи. Прежде всего, вам нужно определить индекс в столбце внешнего ключа в ссылочной таблице (так что foo_bar.foo_id, в вашем случае). Затем перейдите к представлению отношения (в ссылочной таблице) и выберите соответствующий столбец (так что в вашем случае foo.id) и действия по обновлению и удалению.
Я думаю, что внешние ключи полезны, если у вас несколько таблиц, связанных друг с другом, в частности, ваши скрипты удаления станут очень короткими, если вы правильно установите параметры ссылок.
РЕДАКТИРОВАТЬ: Убедитесь, что обе таблицы имеют выбранный двигатель InnoDB.
phpMyAdmin позволяет вам определять внешние ключи, используя их "отношения". Но поскольку MySQL поддерживает только внешние ограничения в таблицах "INNO DB", первый шаг состоит в том, чтобы убедиться, что используемые вами таблицы имеют такой тип.
Чтобы настроить внешний ключ, чтобы столбец PID в таблице с именем CHILD ссылался на столбец идентификатора в таблице с именем PARENT, вы можете сделать следующее:
Выполняя экспорт в таблице CHILD, вы должны увидеть, что для столбца PID было создано ограничение внешнего ключа.
Это краткое изложение статьи в Википедии. Он определяет различные типы отношений, которые вы можете установить в PHPmyadmin. Я помещаю это здесь, потому что это относится к комментарию @Nathan по установке параметров внешних ключей для "при обновлении/удалении", но слишком велик для комментария - надеюсь, это поможет.
CASCADE
Всякий раз, когда строки в основной (ссылающейся) таблице удаляются (соответственно обновляются), соответствующие строки дочерней (ссылающейся) таблицы с соответствующим столбцом внешнего ключа также удаляются (соответственно обновляются). Это называется каскадным удалением (соответственно update [2]).
RESTRICT
Значение не может быть обновлено или удалено, если в таблице внешнего ключа существует строка, которая ссылается на значение в ссылочной таблице. Аналогичным образом, строка не может быть удалена, пока есть ссылка на нее из таблицы внешнего ключа.
БЕЗДЕЙСТВИЕ
НЕТ ДЕЙСТВИЙ и ОГРАНИЧЕНИЯ очень похожи. Основное различие между NO ACTION и RESTRICT заключается в том, что при NO ACTION проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед попыткой выполнения оператора UPDATE или DELETE. Оба ссылочных действия действуют одинаково в случае сбоя проверки ссылочной целостности: оператор UPDATE или DELETE приведет к ошибке.
SET NULL
Значения внешнего ключа в ссылочной строке устанавливаются в NULL, когда ссылочная строка обновляется или удаляется. Это возможно только в том случае, если соответствующие столбцы в ссылочной таблице обнуляются. Из-за семантики NULL для ссылочной строки с NULL в столбцах внешнего ключа не требуется ссылочная строка.
УСТАНОВИТЬ ПО УМОЛЧАНИЮ
Как и в случае SET NULL, значения внешнего ключа в ссылочной строке устанавливаются в столбец по умолчанию при обновлении или удалении ссылочной строки.
В phpmyadmin вы можете назначить внешний ключ просто своим графическим интерфейсом. Нажмите на таблицу и перейдите на вкладку "Структура". найдите вид соответствия только внизу таблицы (показано на рисунке ниже).
Вы можете назначить ключ штамповки из списка рядом с первичным ключом (см. рисунок ниже). и сохраните
соответствующий SQL-запрос автоматически сгенерирован и выполнен.
Для новичков в базе данных.... и нужно изменить существующую таблицу. Многие вещи кажутся довольно простыми, но всегда есть что-то... между А и В.
Прежде всего, взгляните на это.
Перейдите на вкладку SQL (я использую phpMyAdmin, должен быть похож на другие) и выполните следующую команду:
ALTER TABLE child_table_name
ADD FOREIGN KEY (P_ID)
REFERENCES parent_table_name (P_ID)
Кликните по дочерней таблице, затем по структуре, наконец, по реляционному виду. Завершите планирование БД там. До этого был хороший ответ о каскаде, ограничении и т.д. Конечно, это можно сделать командами...
Внешний ключ означает, что не первичный атрибут таблицы ссылается на первичный атрибут другого * в 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: Вы должны добавить строку: default-storage-engine = InnoDB в разделе [mysqld] вашего конфигурационного файла mysql (my.cnf или my.ini в зависимости от вашей ОС) и перезапустите службу mysqld.
Шаг 2: Теперь, когда вы создаете таблицу, вы увидите тип таблицы: InnoDB
Шаг 3: Создайте таблицу "Родительский и дочерний". Теперь откройте таблицу Child и выберите столбец U, чтобы иметь внешний ключ: Выберите индексный ключ из метки действия, как показано ниже.
Шаг 4: Теперь откройте представление отношения в той же дочерней таблице снизу рядом с представлением "Печать", как показано ниже.
Шаг 5: Выберите столбец U, чтобы иметь внешний ключ в качестве столбца "Выбрать родительский элемент" в раскрывающемся списке. dbName.TableName.ColumnName
Выберите соответствующие значения для ON DELETE и ON UPDATE
Из официальной документации MySQL по адресу https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html:
MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы.