Налаштування сторонніх ключів у phpMyAdmin?


335

Я налаштовую базу даних за допомогою 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;

Мені просто незручно не мати ФД чітко визначених у базі даних.

Відповіді:


365

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

Я думаю, що зовнішні ключі корисні, якщо у вас декілька таблиць, пов'язаних між собою, зокрема, сценарії видалення стануть дуже короткими, якщо правильно встановити параметри посилання.

EDIT: Переконайтесь, що в обох таблицях вибрано двигун InnoDB.


93
Порада: перегляд відносин - це невелике посилання під вашим столом, мені важко було знайти його в першу чергу
Младен Яньєтович,

14
Якщо це посилання не відображається там, у такому випадку: Переконайтеся, що ваша таблиця типу InnoDB (на вкладці "Операції" в phpMyAdmin), щоб цього не відбулося.
muttley91

4
@ muttley91Моя таблиця - InnoDB. Я двічі перевірив. Посилання все ще не відображається.
afilina

6
@afilina У новій версії phpMyAdmin її видно вгорі всередині вкладки "Структура", трохи нижче рядка вкладок, що показує "Огляд", "Структура" тощо
Astitva Srivastava

225

phpMyAdmin дозволяє визначати зовнішні ключі, використовуючи їх перегляд "відносини". Але оскільки MySQL підтримує лише зовнішні обмеження для таблиць "INNO DB", перший крок - переконатися, що використовувані таблиці мають цей тип.

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

  1. Для обох таблиць перейдіть на вкладку "Операції" та змініть їх тип на "INNO DB"
  2. Переконайтеся, що ID - це первинний ключ (або принаймні індексований стовпець) таблиці PARENT.
  3. У таблиці CHILD визначте індекс для стовпця PID.
  4. Переглядаючи вкладку структури таблиці ДІТИ, натисніть посилання "перегляд відношення" трохи вище розділу "Додати поля".
  5. Вам буде надана таблиця, де кожен рядок відповідає індексованому стовпцю у вашій таблиці КЛІЄНТА. Перше спадне меню у кожному рядку дозволяє вам вибрати, яку ТАБЛИЦЮ-> СТОЛЮВАТИ індексовані посилання стовпця. У рядку для PID виберіть зі спадного меню PARENT-> ID та натисніть кнопку GO.

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


2
Вау, дуже важлива річ, яку потрібно знати. Ця сторінка була не першим, що я знайшов, шукаючи допомоги з додаванням іноземного ключа, я б хотів, щоб про це згадували частіше.
користувач1299656

86

Це короткий виклад статті у Вікіпедії. Він визначає різні типи відносин, які ви можете встановити в PHPmyadmin. Я викладаю це, оскільки це стосується коментаря @ Nathan щодо встановлення параметрів зовнішніх ключів для "оновлення / видалення", але занадто великий для коментаря - сподіваюся, це допоможе.

КАСКАД

Щоразу, коли рядки в головній (згаданій) таблиці видаляються (респ. Оновлюються), відповідні рядки дочірньої таблиці (посилання) із відповідним стовпцем із зовнішнім ключем також будуть видалені (респ. Оновлені). Це називається каскадним видаленням (відповідно, оновлення [2]).

ОБМЕЖЕННЯ

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

НІЯКИХ ДІЙ

БЕЗ ДІЇ та ОБМЕЖЕННЯ дуже схожі. Основна відмінність NO ACTION від RESTRICT полягає в тому, що при NO ACTION перевірка референтності цілісності проводиться після спроби змінити таблицю. RESTRICT робить перевірку, перш ніж спробувати виконати операцію UPDATE або DELETE. Обидві референтні дії діють однаково, якщо перевірка цілісності референту не вдається: оператор UPDATE або DELETE призведе до помилки.

Встановити NULL

Значення зовнішнього ключа у рядку, що посилається, встановлюються на NULL, коли оновлений рядок оновлюється або видаляється. Це можливо лише в тому випадку, якщо відповідні стовпці таблиці посилань є нульовими. Через семантику NULL для референційного рядка з NULL у стовпцях із зовнішнім ключем не потрібен посилальний рядок.

ВСТАНОВИТИ ЗА ЗАМОВЧУВАННЯМ

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


1
Ще краще, перейдіть безпосередньо до вихідної документації MySQL: dev.mysql.com/doc/refman/5.6/uk/create-table-foreign-keys.html
kmoser

62

У phpmyadmin ви можете призначити іноземний ключ просто за його GUI. Клацніть на таблиці та перейдіть на вкладку Структура. знайдіть Вигляд відношення лише внизу таблиці (показано на зображенні нижче).

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

Ви можете призначити ключ підробки з поля списку поруч із первинним ключем (див. Зображення нижче). і зберегти

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

відповідний запит SQL автоматично генерується та виконується.


16

Для тих, хто є новим у базі даних .... та потрібно ВІДНОВИТИ існуючу таблицю. Багато речей здаються досить відвертими, але між А і Б завжди є щось ...

Перш за все, погляньте на це .

  1. Переконайтеся, що у вас є P_ID (батьківський ідентифікатор для батьківської та дочірньої таблиці).
  2. Звичайно, це вже буде заповнене у батьків. Не обов’язково у дитини правдиво і остаточно. Так, наприклад, P_ID №3 (можливо, багато разів у дочірній таблиці буде вказувати на оригінальний P_ID у батьківській таблиці).
  3. Перейдіть на вкладку SQL (я використовую phpMyAdmin, має бути подібним в інших) і виконайте цю команду:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Клацніть на дочірньому столі, а не на структурі, нарешті на реляційному огляді. Закінчіть там планування БД. Перед цим була хороша відповідь про каскад, обмеження тощо. Звичайно, це можна зробити командами ...


9

Іноземний ключ означає непервинний атрибут таблиці, який стосується атрибута основного іншої * в phpMyAdmin *, спочатку встановіть стовпець, який потрібно встановити в якості індексу.

потім натисніть на ПОВЕРНЕННЯ ВІДНОСНОСТІ

там ви можете знайти варіанти встановити зовнішній ключ


7

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


4
Зовнішні ключові обмеження заощаджують мені багато зусиль та потенційних помилок. Наприклад, скажімо, що я збираюся видалити користувача зі своєї системи. Я можу написати код, який визначає кожне місце в базі даних, де є дані про цього користувача, і наказати його видалити. Але я мушу постійно підтримувати цю функцію видалення. З іншого боку, якщо всі дані, пов’язані з користувачем, мають ідентифікатор FK до ідентифікатора користувача і встановлений для каскаду при видаленні, весь мій код повинен сказати: "видалити цього користувача", і база даних подбає про видалення всього, що має посилання FK на цього користувача. Набагато чистіший для обслуговування.
Натан Лонг

1
@Nathan: Ось що я кажу в дописі. Ви можете це впоратися і на рівні моделі. Ви можете реалізувати при видаленні каскаду з моделі.
Маркус

3
Ви майже завжди додаєте референтну цілісність до таблиць вашої бази даних. База даних повинна захищати себе від поганого програмування додатків. Не покладайтеся лише на вашу програму, щоб підтримувати цілісність даних. Звичайно, завжди є винятки з кожного правила, але я цього не знайшов.
Харв

4

Не забувайте, що два стовпці повинні мати один і той же тип даних.

наприклад, якщо один стовпець типу INT, а другий - тип tinyint, ви отримаєте таку помилку:

Помилка створення зовнішнього ключа в [PID-колонці] (перевірка типів даних)


3

Крок 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 введіть тут опис зображення


2

Перший встановити Storage Engine як InnoDB

Перший встановити Storage Engine як InnoDB

тоді параметр перегляду відношень увімкнути в меню структури

тоді параметр перегляду відношень увімкнути


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

2

Це стара тема, але відповідь, тому що якщо вона корисна комусь.

Крок 1 . Ваш двигун зберігання даних встановлений на InnoDB

Крок 2 . Створіть первинну таблицю

тут customerпервинна таблиця і customer_idпервинний ключ

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

Крок 3 . створити таблицю із зовнішнім ключем та дати індекс

тут ми маємо customer_addressesяк пов’язані таблиці та адреси клієнтів магазину, тому тут customer_idстосунки з customerтаблицею

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

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

Якщо ви забули вказати індекс під час створення таблиці , то ви можете дати індекс на вкладці структури таблиці, як показано нижче.

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

Крок 4 . Після введення індексу в поле, перейдіть на вкладку "Структура" і натисніть на " Відношення перегляду", як показано на малюнку нижче

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

Крок 5 . Тепер виберіть ON DELETE та ON UPDATE, що ви хочете зробити, виберіть стовпчик із поточної таблиці, виберіть DB (SAME DB), виберіть таблицю відношень та первинний ключ із цієї таблиці, як показано на малюнку нижче, та збережіть її

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

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



0

Новіші версії phpMyAdmin більше не мають опції " Перегляд відносин ", і тоді вам доведеться виконати операцію, щоб досягти того самого. Наприклад

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.