[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: FOREIGN KEY
Dezmont
Добрый день, подскажите пожалуйста.
Предположим создаю я 2 таблицы:

CREATE TABLE `person` (`id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255),
`age` VARCHAR(255), PRIMARY KEY (`id`));
CREATE TABLE `driver` (`id` INT(11) NOT NULL AUTO_INCREMENT,`id_person` INT(11) NOT NULL,
PRIMARY KEY (`id`), FOREIGN KEY (`id_person`) REFERENCES `person` (`id`));

В person указываются имена (Василий, Пётр, Владимир...), а в driver в ячейке id_person стоят эти элементы, которые могут повторяться. Как я понял, тут нужен FOREIGN KEY.
Сделал в общем так как в листинге.
Вопрос в следующем. У меня есть форма, куда должно вводится имя drivera. Как мне сделать, чтобы при вводе в поле формы name, выбиралось соответствующее id из person и записывалось в id_person таблицы driver? Или же для этого уже нужны средства стороннего языка?

P.S. И объясните пожалуйста, что вообще даёт этот FOREIGN KEY? Потому что создав таблицу, я так и не понял. При добавлении в id_person значений, которых нет в столбце id таблицы person, MySQL не выдаёт никаких ошибок, а спокойно добавляет несуществующее значение.
Какой прок от этого внешнего ключа?



Спустя 24 минуты, 2 секунды (7.12.2011 - 11:38) minor написал(а):
Цитата
В person указываются имена (Василий, Пётр, Владимир...), а в driver в ячейке id_person стоят эти элементы, которые могут повторяться. Как я понял, тут нужен FOREIGN KEY.

id_person может повторятся и без FOREIGN KEY не обязательно его использовать, если вы об этом
Цитата
Как мне сделать, чтобы при вводе в поле формы name, выбиралось соответствующее id из person и записывалось в id_person таблицы driver?

с помощью where `person`.`id` = `driver`.`id_person`
Цитата
И объясните пожалуйста, что вообще даёт этот FOREIGN KEY?

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

Спустя 5 минут, 24 секунды (7.12.2011 - 11:43) Placido написал(а):
Цитата (Dezmont @ 7.12.2011 - 10:14)
При добавлении в id_person значений, которых нет в столбце id таблицы person, MySQL не выдаёт никаких ошибок, а спокойно добавляет несуществующее значение.
Какой прок от этого внешнего ключа?

У таблицы тип хранилища не MyISAM, случаем?

Спустя 17 минут, 27 секунд (7.12.2011 - 12:01) Dezmont написал(а):
minor, вот сейчас проверил, спокойно удалилась строка с id=2 из таблицы person. Хотя на неё есть ссылка в таблице driver.


Placido, а как посмотреть тип хранилища таблицы? Есть какая-нибудь команда? Этого я не менял, у меня по умолчанию стоит...

У меня 4 строки в таблице person c id 1,2,3,4. И 7 строк в таблице driver c id_person 1,2,3,4,5,6,7. Разве так и должно быть? Я в нете читал, вроде ж не должно позволять вставлять значения в id_person, которых нет в id таблицы person?

P.S. Запустил phpMYadmin, там в Type стоит MyISAM. Нужно изменить на InnoDB, чтобы всё работало как надо?

Спустя 6 минут, 40 секунд (7.12.2011 - 12:07) minor написал(а):
Если юзаете phpmyadmin то там есть столбец Тип.
По умолчанию вроде как тип MyISAM.

Спустя 1 минута, 48 секунд (7.12.2011 - 12:09) Placido написал(а):
Цитата (minor @ 7.12.2011 - 11:07)
По умолчанию вроде как тип MyISAM.

В MySQL 5.5 по умолчанию InnoDB.

Спустя 2 минуты, 37 секунд (7.12.2011 - 12:12) Placido написал(а):
Цитата (Dezmont @ 7.12.2011 - 11:01)
Placido, а как посмотреть тип хранилища таблицы? Есть какая-нибудь команда? Этого я не менял, у меня по умолчанию стоит...

Тип хранилища - show create table `имя таблицы`
По умолчанию - show variables like 'storage_engine'

Спустя 5 минут, 41 секунда (7.12.2011 - 12:17) Placido написал(а):
Цитата (Dezmont @ 7.12.2011 - 11:01)
Нужно изменить на InnoDB, чтобы всё работало как надо?

Да.
ALTER TABLE `имя таблицы` ENGINE=InnoDB;

Спустя 9 минут, 5 секунд (7.12.2011 - 12:27) minor написал(а):
Возможно без FOREIGN KEY как то так=) если я верно понял что вам нужно
  INSERT INTO `driver`
SET
`driver`.`id_person` = `person`.`id
WHERE
`
person`.`name` = nameFromForm;

Спустя 37 секунд (7.12.2011 - 12:27) Dezigo написал(а):
Это называется отношения и cссылочная целостность
(Wikipedia)
Нормалицация базы данных. Такие отношения как:
  • 1 к многим
  • многим ко многим
  • многим к 1
У вас 1 ко многим.
Цитата
P.S. И объясните пожалуйста, что вообще даёт этот FOREIGN KEY? Потому что создав таблицу, я так и не понял

Это даст вам возможность
- убрать избыточность
- убрать не существующие связи по id (в которых есть допустим driver но нет , такой id в персон)
- даёт вам способность построить графический план в визуальном плане, что улучшает видимость происходящего
- даёт возможность использовать каскадное обновление и каскадное удаление
- не даёт возможность добавить ключи , если они не существует в другой таблице
Если хотите пример могу приложить.
Цитата
id_person может повторятся и без FOREIGN KEY не обязательно его использовать, если вы об этом

Да, вы правы ,но это считается дурным тоном и не образованностью.

Спустя 40 минут, 30 секунд (7.12.2011 - 13:08) Dezmont написал(а):
Ну да... Версия MySQL 5.0.7. Спасибо большое, поменял через SET storage_engine на InnoDB.

Может кому будет полезно: SET storage_engine=InnoDB;
В сессии переключает тип хранилища таблиц.

P.S. А посоветуйте для чайника как я книжку по SQL. Впринципе мне хватает нынешних знаний, чтобы на примитивном уровне с БД работать. Но хотелось бы делать всё правильно. По Архитектуре БД может какая-нибудь не очень тяжёлая книжка для новичков есть?

P.P.S. И подскажите по синтаксису в SQL запросе, как правильнее:
CREATE TABLE `contragent` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255), PRIMARY KEY (`id`))";

или так:
CREATE TABLE contragent (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255), PRIMARY KEY (id))";

или ещё как-нибудь... На что это влияет, что может произойти, если будет так, а не так... Наставьте на истинный путь :D

Спустя 2 часа, 30 минут, 12 секунд (7.12.2011 - 15:38) Placido написал(а):
Обрамлять имена БД/таблиц/полей и т.п. обратными кавычками `` нужно для того, чтобы не было проблем, если какое-то имя совпадет с зарезервированными словами SQL (например, GROUP). К тому же, эти имена могут состоять из двух и более слов, некоторых спецсимволов (правда, многие считают это дурным тоном), а без обратных кавычек это невозможно.

По MySQL есть хороший курс от компьютерного центра "Специалист".

Спустя 50 минут, 43 секунды (7.12.2011 - 16:29) caballero написал(а):
Цитата
Обрамлять имена БД/таблиц/полей и т.п. обратными кавычками `` нужно для того, чтобы не было проблем, если какое-то имя совпадет с зарезервированными словами SQL (например, GROUP). К тому же, эти имена могут состоять из двух и более слов, некоторых спецсимволов (правда, многие считают это дурным тоном), а без обратных кавычек это невозможно.


Дурной тон - вообще давать имена которые требуют кавычек

Dezmont
А теперь задай себе вопрос - на фига тут нужны внешние ключи? Что ты с ними будешь делать?

Спустя 20 минут, 30 секунд (7.12.2011 - 16:49) sebastjan написал(а):
Dezmont
Вот, сам только что нашол и поуши рад.
А то мои понимания с БД были на уровне неардельтальца.
MySQL 5.0. Библиотека программиста
Скинь в личку мыло - книжка ПДФ я тебе на мыло вышлю 3,6 МЕга.

Спустя 6 дней, 20 часов, 32 минуты, 2 секунды (14.12.2011 - 13:21) Dezmont написал(а):
Народ, помогите ещё с 2 пунктами.
1. Как сделать, чтобы в таблице с внешним ключом не сбивался id, при неудачном INSERT в эту таблицу?

2. Как лучше и правильнее делать:
---использовать FOREIGN KEY, а в php обрабатывать ошибку и в зависимости от ошибки, совершать нужные действия.
---или выполнять функцию FOREIGN KEY средствами php?

Спустя 2 часа, 53 минуты, 44 секунды (14.12.2011 - 16:15) caballero написал(а):
Поверяй данные с помощью PHP и вставляй корректно.
Нафиг тебе геморой с внешними ключами, которые еще и сервер тормозят
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.