Створимо в базі даних дві зв'язані таблиці. В першій буде список країн, а в другій - список грошових одиниць. Зв'яжемо країни з відповідними грошовими одиницями.
<?php
$sql = "
CREATE TABLE IF NOT EXISTS country_m
(
id INT (2) PRIMARY KEY AUTO_INCREMENT,
country VARCHAR(20) NOT NULL
)";
$pdo->exec($sql);
echo "Таблиця `country_m` готова до використання";
$sql="
CREATE TABLE IF NOT EXISTS money
(
id INT PRIMARY KEY AUTO_INCREMENT,
money VARCHAR(20) NOT NULL,
country_id INT(2),
// встановлюємо назву ключа (не обов'язково)
CONSTRAINT my_foreign_key
FOREIGN KEY (country_id) REFERENCES country_m (id) ON DELETE CASCADE
)";
$pdo->exec($sql);
echo "Таблиця `money` готова до використання";
?>
Таблиця `money` готова до використання
Заповнимо таблиці
<?php
$data = $pdo->query ("INSERT INTO `country_m` (`country`)
VALUES ('Бразилія'),('Турція'),('Польща') ");
$data = $pdo->query ("INSERT INTO `money` (`country_id`,`money`)
VALUES ('1','реал'),('2','ліра'),('3','злотий') ");
?>
Виведемо результат
<?php
/* таблиця country_m */
$sql ="SELECT * FROM country_m";
$stmt = $pdo->query($sql);
echo "<table><tr><th>id</th><th>country</th></tr>";
while ($row = $stmt->fetch())
{
echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";
}
echo "</table>";
/* таблиця money */
$sql ="SELECT * FROM ";
$stmt = $pdo->query($sql);
echo "<table><tr><th>id</th><th>money</th><th>country_id</th></tr>";
while ($row = $stmt->fetch())
{
echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td></tr>";
}
echo "</table>";
?>
| id | country |
|---|---|
| 1 | Бразилія |
| 2 | Турція |
| 3 | Польща |
money
| id | money | country_id |
|---|---|---|
| 1 | реал | 1 |
| 2 | ліра | 2 |
| 3 | злотий | 3 |
Обмеження ключів ON DELETE та ON UPDATE
За допомогою виразів ON DELETE и ON UPDATE можемо встановити дії, які виконуються у разі видалення або зміни (відповідно) зв'язаного рядка з головної таблиці. Для обмеження дій можуть використовуватись наступні опції:
CASCADE: автоматично видаляє або змінює рядки при зміні чи видаленні рядка в головній таблиці
SET NULL: при видаленні або зміні рядка головної таблиці встановлює для стовбчика з зовнішнім ключем значення NULL ( в цьому разі стовбчик зовнішнь ого ключа повинен підтримувати NULL)
RESTRICT: відхиляє видалення або зміну рядків в головній таблиці при наявності зв'язаних рядків в залежній таблиці
NO ACTION: те ж саме, що і RESTRICT
За замовчуванням встановлено RESTRICT:При створенні таблиць було зазначено, що видалення рядка у головній таблиці приведе до видалення відповідного рядка у підлеглій таблиці
FOREIGN KEY (country_id) REFERENCES country_m (id) ON DELETE CASCADE
Видаляємо рядок з Бразилією і побачимо чи потягне це за собою видалення відповідного рядка у другій таблиці
<?php
// видаляємо
$sql = "DELETE FROM `country_m` WHERE `country` = 'Бразилія'";
$query = $pdo->query($sql);
?>
| id | country |
|---|---|
| 2 | Турція |
| 3 | Польща |
money
| id | money | country_id |
|---|---|---|
| 2 | ліра | 2 |
| 3 | злотий | 3 |
Розірвання зв'язку між таблицями
// вказуємо ім'я ключа, який зазначали в CONSTRAINT
$stmt = $pdo->query("ALTER TABLE `money` DROP FOREIGN KEY `my_foreign_key`");
далі ✏