Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Связянные таблицы


Автор: Raiser 28.7.2006, 09:19
Здравствуйте, хочу разобраться со связанными таблицами.
У меня есть несколько таблиц:
Таблица  maininf

| id | name | link | description |
| 1  | some | ht.  | blablabla    |

id - первичный ключ, уникальный
name - имя описываемого объекта, в этой таблице содержится основная информация.

Есть ещё одна таблица, с дополнительной информацией по каждому объекту:
Таблица  moreinf

| id | name | some1 | some2       |
| 1  | some | ht.   | blablabla    |

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

Вопрос вот в чем: как создать (какой запрос необходим), чтобы правильно создать вторую таблицу с внешним ключем?
И как производить выборку данных, например, мне надо по id найти name в первой таблице и имея этот name во второй таблице получить дополнительные данные по описываемому объекту?  

Автор: SamDark 28.7.2006, 09:26
Raiser
1. Не стоит дублировать name в 2-х таблицах.
2. Для вставки сначала заносим данные в первую таблицу, затем во вторую (во второй ключ не автоинкрементный) с использование в качестве значения id функцию LAST_INSERT_ID().
3. Выборка из обоих таблиц будет представлять из себя что-то вроде
Код

select * from maininf ma, moreinf mo where ma.id=mo.id and <тут критерий выборки>
 

Автор: madFobos 31.7.2006, 23:45
Никогда не стоит делать связь между таблицами по текстовому полю (в твоем случае name), т.к. 1) сравнение строк происходит на порядок мделеннее чисел (при SELECT), а второе ты не сможешь использовать такую возможность как LAST_INSER_ID() при вставке. Так же не стоит во всех таблицах делать первичный ключ с именем id, а то потом запутаешься в связях между таблицами.

Я бы таблицы переделал так для начала
maininf_id | name | link | description
moreinf_id | maininf_id | some1 | some2

Ну и вставка будет примерно такая

Код

  mysql_query("INSERT INTO mainif (name, link, description) VALUES ('value1', 'value2', 'value3')");
  mysql_query("INSERT INTO moreinf (mainif_id, some1, some2) VALUE (".mysql_insert_id().", 'more1', 'more2')");
  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)