Вопрос

Я настраиваю базу данных с помощью 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 ссылался на столбец ID в таблице с именем PARENT, вы можете сделать следующее:

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

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

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

КАСКАД

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

ОГРАНИЧИВАТЬ

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

БЕЗДЕЙСТВИЕ

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

УСТАНОВИТЬ НУЛЬ

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

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

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

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

 введите описание изображения здесь

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

 введите описание изображения здесь

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

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

Прежде всего, ознакомьтесь с этим . <Ол>

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

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES 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, вы получите следующую ошибку:

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top