Progress28.ru

IT Новости
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Phpmyadmin внешний ключ

Denis.in.ua

Блог имени Меня

Использование внешних ключей в MySQL

Нет, внешние ключи (foreign keys) на самом деле не из Бразилии или Италии, и даже не из США. Для тех кто не в теме, они могут показаться странными. Но не бойтесь, мы здесь как раз для того, чтобы научить вас как с ними обращаться. Итак, что собой представляют внешние ключи?

Внешние ключи — это как раз то, что делает реляционные базы «реляционными» (от relation(англ.)- отношение, связь)(прим. переводчика: Как отметил в комментариях Дима Христов, на самом деле, базы названны реляционными из-за их группировки в таблицы, а не из-за связи между таблицами). Это как раз те связующие цепочки, которые связывают таблицы между собой. Они позволяют вам разместить «покупателей» в одной таблице, «заказы» в другой, а товары из этих заказов, в третьей, таким образом в базе минимизируется избыточность данных. Чем меньше избыточных данных — тем больше у вас шансов сохранить целостность данных (две или более противоречащие друг-другу записи — это всегда плохо).

Пример

Самое время продемонстрировать все на практике. Этот пример написан для MySql, если вы используете другую СУБД, прочитайте сперва документацию по ней. Этот блок SQL содержит исходный код создания таблиц для нашего примера:

CREATE TABLE usr (
usr_ >INT AUTO_INCREMENT NOT NULL ,
FIRST VARCHAR ( 25 ) NOT NULL ,
surname VARCHAR ( 50 ) NOT NULL ,
PRIMARY KEY ( usr_ >)
) ENGINE = InnoDB CHARACTER SET = UTF8;
CREATE TABLE product (
prod_ >INT AUTO_INCREMENT NOT NULL ,
name VARCHAR ( 40 ) NOT NULL ,
descr VARCHAR ( 255 ) NOT NULL ,
PRIMARY KEY ( prod_ >)
) ENGINE = InnoDB CHARACTER SET = UTF8;

CREATE TABLE invoice (
inv_ >INT AUTO_INCREMENT NOT NULL ,
usr_ >INT NOT NULL ,
prod_ >INT NOT NULL ,
quantity INT NOT NULL ,
PRIMARY KEY ( inv_ >)
) ENGINE = InnoDB CHARACTER SET = UTF8;

А на это Диаграммы Отношений, для этих таблиц:

В таком виде, как это представлено сейчас, таблицы не связаны между собой, кроме как через названия колонок.

Могли бы мы хранить всю информацию в одной таблице? Конечно! Можно было бы создать таблицу, которая содержала бы в себе всю информацию о покупателе, данные о товаре и количество заказанных товаров. Но что случится, если мы допустим ошибку в одной из записей в описании товара или имени покупателя? О, нет, теперь все испорчено! Получим ли мы записи с опечатками вместе с другими записями? Что если нет? У нас некорректные данные — небеса рухнули.

Добавляем внешние ключи

Теперь пришло время установить связи между таблицами, которых не хватало до сих пор. Соединим колонки usr_id и prod_id таблицы invoice с их соответствиями в таблицах usr и product.

Вы можете выполнить команду ALTER для таблицы invoice, но я предпочитаю вносить такие изменения на этапе проектирования, поэтому можно внести изменения прямо запрос создания таблицы:

Заметьте, что в новом варианте запроса CREATE для таблицы invoice, я добавил синтаксис FOREIGN KEY ( ) REFERENCES table(
) чтобы установить связь между таблицами.

Просто добавив объявления внешних ключей, мы добились встроенной защиты целостности данных. Если мы попытаемся выполнить запрос INSERT или UPDATE со значением внешнего ключа для таблицы invoice, база данных автоматически проверит существует ли данное значение в связанной таблице. Если указанных значений в связанных таблицах не существует — база данных не выполнит запрос INSERT/UPDATE, сохранив таким образом целостность данных.

Теперь не придется проверять вручную родительскую таблицу на существование конкретных значений, прежде чем вставить данные в таблицу-потомок. Также можете спокойно удалять записи. Хотите избежать ошибок новым способом? Меньше кодирования — лучший способ для ленивых программистов.

Поддадим газку

Готовы улучшить ваши внешние ключи еще? Да, они могу сделать значительно больше для вас.

На данный момент, у нас есть защита целостности данных на случай каких-либо манипуляций с таблицами-потомками, но что если внести изменения в родительскую таблицу? Как нам быть уверенными, что таблицы-потомки в курсе всех изменений в родительской таблице?

MySQL позволяет нам контролировать таблицы-потомки во время обновления или удаления данных в родительской таблице с помощью подвыражений: ON UPDATE и ON DELETE. MySQL поддерживает 5 действий, которые можно использовать в выражениях ON UPDATE и/или ON DELETE.

  • CASCADE: если связанная запись родительской таблицы обновлена или удалена, и мы хотим чтобы соответствующие записи в таблицах-потомках также были обновлены или удалены. Что происходит с записью в родительской таблице, тоже самое произойдет с записью в дочерних таблицах. Однако не забывайте, что здесь можно легко попасться в ловушку бесконечного цикла.
  • SET NULL:если запись в родительской таблице обновлена или удалена, а мы хоти чтобы в дочерней таблице некоторым занчениям было присвоено NULL (конечно если поле таблицы это позволяет)
  • NO ACTION: смотри RESTRICT
  • RESTRICT:если связанные записи родительской таблицы обновляются или удаляются со значениями которые уже/еще содержатся в соответствующих записях дочерней таблицы, то база данных не позволит изменять записи в родительской таблице. Обе команды NO ACTION и RESTRICT эквивалентны отсутствию
    подвыражений ON UPDATE or ON DELETE для внешних ключей.
  • SET DEFAULT:На данный момент эта команда распознается парсером, но движок InnoDB никак на нее не реагирует.

Для моей базы данных из примера, я решил, что для внешних ключей из таблицы invoice, UPDATE будут выполняться каскадно для дочерних таблиц, а удаление будет запрещено. Таким образом, любые изменения в таблицах usr и product автоматически отразятся в таблице invoice, но если товар заказан или если у пользователя есть счет — они не могут быть удалены.

Читать еще:  Парсинг даты php

Ниже представлен новый вариант запроса CREATE для таблицы invoice с внешними ключами и выражениями ON UPDATE и ON DELETE

Выводы

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

MySQL. Урок 3. Создание внешнего ключа. FOREIGN KEY.

В предыдущем уроке мы познакомились с СУБД MySQL, создали свою первую базу данных и таблицу, получив самые базовые знания для работы с языком SQL. Также мы узнали о таких понятиях как первичные и внешние ключи. Сегодняшний урок посвящен именно вторым.

Внешний ключ — это поле таблицы, использующееся для связи с другими таблицами. В БД каждая таблица представляет собой отдельную сущность вашей предметной области. Наша таблица books представляет собой конкретную сущность — книгу.

Нам незачем добавлять в данную таблицу несколько полей, связанных со сведениями о ее авторе. Гораздо логичнее было бы отдельно выделить эту сущность и поместить ее в другую таблицу. Тогда в одной таблице мы бы хранили список всех книг в системе, а другой — список авторов. Но у каждой книги есть свой автор, также как и у каждого автора может быть несколько книг. Осталось как-то установить эту связь между ними.

Для этого вместо того, чтобы создавать поле author и прописывать туда для каждой книги его имя, мы поступим более гибко: создадим поле author_id, которое будет ссылаться на поле id в новой таблице authors.

В нашем случае поле author_id — это внешний ключ. При использовании данного подхода мы всегда сможем получить сведения об авторе выбранного произведения и даже чуточку больше о нем самом. При этом нам не придется все данные сваливать в одну таблицу. Вы уже наверное и сами догадались, как это будет выглядеть.

Дополнительно: данная схема была создана с использованием очень простого и из-за этого удобного сервиса DbDesigner.

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

Сначала напишем запрос, создающий таблицу authors, которая будет хранить сведения обо всех писателях, а затем добавим в таблицу books внешний ключ — author_id, связав ее таким образом с таблицей authors.

Теперь нам нужно добавить внешний ключ. Это можно было сделать изначально при создании таблицы. Но так как наша таблица уже была создана, то добавим связь с помощью уже знакомой нам команды ALTER TABLE:

Таким образом, мы добавляем связь между полем author_id таблицы books и полем id таблицы authors.

Мы видим. что в тип ключа равен MUL. Это означает, что значение данного поля не является уникальным и мы можем добавить несколько записей с одним и тем же значением данного поля. Это логично, так как у нас может быть несколько книг за авторством одного и того же писателя. поле также может иметь тип UNI(UNIQUE). В этом случае мы бы не смогли добавить в нашу таблицу две строки с одним и тем же значением данного поля.

Мы упомянули, что создать связь между таблицами можно и в команде CREATE TABLE. Тогда запрос для создания таблицы books выглядел бы следующим образом:

Обязательным условием в данном случае будет существование таблицы authors. Если попытаться выполнить скрипт при ее отсутствии, то вы получите сообщение об ошибке.

MySQL. Урок 5. Команды изменения и удаления таблиц. ALTER TABLE и DROP TABLE.

MySQL. Урок 4. Команды вставки и выборки данных. INSERT и SELECT.

2 комментария

Хочу посмотреть предыдущий урок а ссылки на него нет.
Здесь ссылки только на два следующих урока. Бардак(((

Перейди на пятый, там есть ссылка на первый и обратно на 5й. Странная нумерация, но можно дойти))

Добавить комментарий Отменить ответ

Свежие записи

Свежие комментарии

  • Илья к записи Парсер Excel-документов с Apache POI.
  • Алекс к записи Скрапинг сайтов на Java. Библиотека Jsoup.
  • Доброжелатель к записи Графы.
  • Анон к записи Вычисление числа Пи при помощи метода Монте-Карло
  • Ренат к записи Вычисление числа Пи при помощи метода Монте-Карло

Архивы

Рубрики

  • Andro >41
  • Git 2
  • Java Basics 12
  • Java EE 15
  • Java FX 1
  • Kotlin 1
  • Linux 3
  • MySQL 16
  • PostgreSQL 1
  • Python 14
  • Spring 5
  • WEB-разработка 12
  • Алгоритмы 6
  • Базы данных 17
  • Без рубрики 50
  • Искусственный интеллект 7
  • Компьютерное зрение 1
  • Машинное обучение 2
  • Нейронные сети 3
  • Обработка текста 2
  • ООП 6
  • Паттерны 12
  • Поиск 1
  • Распознавание речи 1
  • Сортировка 7
  • Структуры данных 9
  • Тестирование 2
  • Фреймворки 11

Copyright © 2020 floppyy blog. Все права защищены.

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

Я настраиваю базу данных с помощью 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.

Читать еще:  Php datetime compare

Кроме того, хотя я еще не смог установить явные внешние ключи, у меня есть реляционная таблица, и я могу выполнять соединения следующим образом:

Просто мне неудобно не иметь FK, явно определенные в базе данных.

InnoDB позволяет добавить новое ограничение внешнего ключа в таблицу с помощью ALTER TABLE:

С другой стороны, если MyISAM имеет преимущества перед InnoDB в вашем контексте, зачем вам вообще создавать ограничения внешнего ключа. Вы можете справиться с этим на уровне модели вашего приложения. Просто убедитесь, что столбцы, которые вы хотите использовать в качестве внешних ключей, проиндексированы!

Если вы хотите использовать phpMyAdmin для настройки отношений, вам нужно сделать 2 вещи. Прежде всего, вы должны определить индекс для столбца внешнего ключа в ссылочной таблице (так, в вашем случае foo_bar.foo_id). Затем перейдите в представление отношений (в таблице ссылок) и выберите указанный столбец (как в вашем случае foo.id), а также действия по обновлению и удалению.

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

РЕДАКТИРОВАТЬ: Убедитесь, что в обеих таблицах выбран движок InnoDB.

phpMyAdmin позволяет вам определять внешние ключи, используя их вид «отношений». Но поскольку MySQL поддерживает только внешние ограничения для таблиц «INNO DB», первый шаг — убедиться, что используемые вами таблицы относятся к этому типу.

Чтобы настроить внешний ключ так, чтобы столбец PID в таблице с именем CHILD ссылался на столбец идентификатора в таблице с именем PARENT, вы можете сделать следующее:

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

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

Не забывайте, что два столбца должны иметь одинаковый тип данных.

например, если один столбец имеет тип INT, а другой — тип tinyint, вы получите следующую ошибку:

Ошибка создания внешнего ключа в столбце [PID] (проверьте типы данных)

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

CASCADE

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

RESTRICT

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

БЕЗДЕЙСТВИЕ

НЕТ ДЕЙСТВИЙ и ОГРАНИЧЕНИЯ очень похожи. Основное различие между NO ACTION и RESTRICT состоит в том, что при NO ACTION проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед попыткой выполнить инструкцию UPDATE или DELETE. Оба ссылочных действия действуют одинаково, если проверка ссылочной целостности не удалась: оператор UPDATE или DELETE приведет к ошибке.

SET NULL

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

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

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

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

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

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

Перейдите на вкладку SQL (я использую phpMyAdmin, должен быть похож на другие) и выполните эту команду:

Нажмите на дочернюю таблицу, затем структуру, наконец, на реляционном представлении. Завершите планирование БД там. До этого был хороший ответ о каскаде, ограничении и т. Д. Конечно, это можно сделать командами .

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

затем нажмите на ОТНОШЕНИЕ СВЯЗИ

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

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

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

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

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

Сначала установите Storage Engine как InnoDB

затем включить опцию просмотра отношения в меню структуры

Это старая ветка, но ответьте, потому что, если это кому-нибудь пригодится.

Шаг 1 Ваш Db Storage Engine установлен на InnoDB

Шаг 2 Создать основную таблицу

здесь customer — это первичная таблица, а customer_id — это первичный ключ.

Шаг 3 создать таблицу внешнего ключа и дать индекс

здесь мы имеем customer_addresses качестве связанной таблицы и храним адреса клиентов, поэтому здесь customer_id соотносится с таблицей customer

мы можем выбрать индекс непосредственно при создании таблицы, как показано ниже

Если вы забыли указать индекс при создании таблицы , вы можете указать индекс на вкладке структуры таблицы, как показано ниже.

Шаг 4 После того как индекс дается в поле, перейдите на вкладку структуры и нажмите на Relation View, как показано на рисунке ниже

Шаг 5 Теперь выберите ON DELETE и ON UPDATE, что вы хотите сделать, выберите столбец из текущей таблицы, выберите DB (SAME DB), выберите таблицу отношений и первичный ключ из этой таблицы, как показано на рисунке ниже, и сохраните его.

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

Create foreign key for MySQL from phpMyAdmin

by Adarsh M | 13 November , 2019

It is simple to create a foreign key in phpMyAdmin for a MySQL database.

A FOREIGN KEY helps to link two tables together. However, users may have trouble finding the options in phpMyAdmin.

At Bobcares, we receive requests to create foreign key a part of our Server Management Services.

Today, let’s see how our Support Engineers create a foreign key for MySQL from phpMyAdmin.

Foreign key MySQL

A foreign key is a column or group of columns in a relational database table. It provides a link between data in two tables.

For a column acting as a foreign key, a corresponding value should exist in the link table.

Foreign keys and their implementation are more complex than primary keys.

InnoDB is the only MySQL database engine that supports foreign keys.

How to create a foreign key in phpMyAdmin for MySQL

Recently one of our customers contacted us to create a foreign key for this MySQL database. Let us discuss how our Support Engineers setup it for our customers.

First we login to phpMyAdmin.

Now select the database to add the foreign key.

We select the table from the database.

MySQL only supports foreign key constraints on ‘InnoDB’ tables. MyISAM has no foreign keys because it is an old system.

If the table is in MyISAM, we change it to InnoDB and proceed further.

In Indexing, we define a primary key in the referred table which will work as the foreign key.

Next, we create a reference for an index we want to apply the foreign key constraints.

Now select the table and now click on the Structure view.

Then select the Relation view.

Finally, we set the foreign keys. We fill in the required details.

Another option is to run an SQL query.

We run the below query

This query is run only when the keys already exist in the relevant table.

Common error when creating a foreign key in MySQL

Recently one of our customers contacted us as he was not able to create a foreign key.

On analyzing the database, one table was using the InnoDB engine while the other was using MyISAM.

To set up foreign key both the tables need to use InnoDB engine. This is because the MyISAM does not support foreign keys.

So we changed the tables engine and then created a foreign key for the customer. We always do take a backup of the database before making any changes.

[Need assistance to fix MySQL error – We’ll help you ]

Conclusion

In short, we have discussed the relevance of foreign keys. Also, we have discussed how our Support Engineers create a foreign key in phpMyAdmin for MySQL.

PREVENT YOUR SERVER FROM CRASHING!

Never again lose customers to poor server speed! Let us help you.

Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.

Ссылка на основную публикацию
Adblock
detector