2014-12-04 3 views
0

Я создаю приложение библиотеки для личного развития и хотел бы более подробно узнать о MySql.Базовые таблицы объединений и внешние ключи

я в настоящее время есть две таблицы 'книга' и 'категория'

книга

id title     author  category  isbn 
---- -------     ---------- ---------- ------- 
1 Treasure Chest   Jim Jones  1   14252637 
2 Pirates Boat   Sue Smith  2   88447737 
3 Adventure Land   Harry Jo  3   01918273 
4 Winter Week    Sam Dill  3   00999337 

категории

id  cat_name 
----  -------   
1  Horror 
2  Kids 
3  Fiction 
4  Science 

Я делаю простой поиск, где я хочу показать все книги (выберите * из книги), и я хотел бы отобразить все книги с их соответствием . Это работает, но отображает номер категории, а не название категории.

например

id  title   author  category isbn 
2710 Animals 123  Tiny Touch 2  978-1-84958-877-5 
2709 Animal Homes Tiny Touch 2  978-1-84958-880-5 
2708 Black and White Usborne  3  978-1-4095-2393-2 
2707 Babies   Usborne  1  978-1-4095-3575-1 

Как я могу изменить эти таблицы таким образом, что cat_name и категории объединяются?

Я попытался выполнить команду в phpmyadmin, как показано ниже, однако она вернула ошибку;

ALTER TABLE book 
ADD FOREIGN KEY (category) REFERENCES category(cat_name); 

ошибка

#1452 - Cannot add or update a child row: a foreign key constraint fails (`sslib`.`#sql-1ab4_1dae`, CONSTRAINT `#sql-1ab4_1dae_ibfk_1` FOREIGN KEY (`category`) REFERENCES `category` (`cat_name`)) 

PHP

$sql = "SELECT * FROM book"; 
$res = $conn->query($sql) or trigger_error($conn->error."[$sql]"); 
while($row = $res->fetch_array()) { //line 101 

    echo '<tbody>'; 
    echo '<tr>'; 
    echo '<td>' . $row['id'] . '</td>'; 
    echo '<td>' . $row['title'] . '</td>'; 
    echo '<td>' . $row['author'] . '</td>'; 
    echo '<td>' . $row['category'] . '</td>'; 
    echo '<td>' . $row['isbn'] . '</td>'; 
    echo '<td>' . $row['publicationYear'] . '</td>'; 
    echo '</tr>'; 
    echo '</tbody>'; 
}; 

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

+3

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

ответ

3

Make SQL присоединиться, чтобы отобразить все книги с соответствующими категориями:

select 
    b.title as 'book_title', 
    c.cat_name as 'category_name' 
from 
    book b 
    inner join category c on (c.id = b.category); 

при вставке новой книги записи, вы должны убедиться, что категория существует. MySQL уже позаботился об этом, предоставив ссылочную целостность (в вашем внешнем ключе). Ссылочная целостность не работает со всеми двигателями. Он поддерживается в InnoDB. Сначала убедитесь, что вы используете InnoDB, так как из MySQL 5.5 по умолчанию.

Возможно, вы захотите попробовать MySQL Workbench. Он поддерживает графическое представление таблицы и соединения между ними, а также создает SQL-скрипт для их создания.

enter image description here

+0

Спасибо @broadband Мне удалось получить его, слегка изменив запрос на SELECT b.id, b.title, b.author, b.isbn, c.cat_name Из книги AS b ВХОДНАЯ СТРАНИЦА категории AS c ON b.category = c.id –

0

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

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