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


Автор: Alexzander 15.11.2005, 14:30
Проблема в следующем:
есть 2 таблицы: таблица каталога ссылок и таблица описаний каждой из ссылок.
Код

mysql> describe linkdescr;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| link_id    | tinyint(4) |      | PRI | 0       |       |
| link_descr | text       | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+

mysql> describe links;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| link_id           | tinyint(4)   |      | PRI | NULL    | auto_increment |
| link_name         | varchar(128) | YES  |     | NULL    |                |
| link_url          | varchar(128) | YES  | MUL | NULL    |                |
| cat_id            | tinyint(4)   |      |     | 0       |                |
| group_id          | tinyint(4)   |      |     | 0       |                |
| link_add_date     | int(10)      |      |     | 0       |                |
| link_click_amount | tinyint(4)   |      |     | 0       |                |
+-------------------+--------------+------+-----+---------+----------------+


вопрос в том, возможно ли одновременно (одним запросом) добавить новую запись в таблицу ссылок (links) и таблицу описаний (linkdescr).

Вот последовательность действий, которая должна быть проделана:
1. занести новую запись в таблицу links, её автоматически присвоится id (MAX( link_id)+1)
2. в таблицу linkdescr занести новую запись, при этом поле link_id должно содержать id только что занесенной ссылки.

проблема, конечно, может быть решена и поочередным выполнением insert, select и снова insert, но, возможно, есть более "красивый" способ?

ЗЫ. сервер 4.0.26

Автор: Ignat 15.11.2005, 14:53
Цитата(Alexzander @ 15.11.2005, 14:30)
сервер 4.0.26

В один запрос не выйдет, два можно.
Код

INSERT INTO `links` .... VALUES ...;
INSERT INTO `linkdescr`(`link_id`, `link_descr`) VALUES (LAST_INSERT_ID(), 'описание');

Автор: Kesh 15.11.2005, 18:19
Можешь транзакции использовать...

Автор: Bose 16.11.2005, 14:01
Цитата(Kesh @ 15.11.2005, 18:19)
Можешь транзакции использовать...

Не "можешь"... а обязательно используй! или вручную проверяй, если первый запрос прошёл без ошибок, только тогда выполняй второй.

Автор: Alexzander 17.11.2005, 15:52
Такой вопрос... LAST_INSERT_ID() считается для конктетного соединения с базой или вообще? Я хочу сказать, что не может ли получиться так, что между первым и вторым запросом другая копия скрипта, выполнив первый запрос, изменит значение LAST_INSERT_ID() для первой копии?

Автор: Ignat 17.11.2005, 16:16
Цитата(Alexzander @ 17.11.2005, 15:52)
изменит значение LAST_INSERT_ID() для первой копии?

Изменит. Чтобы это избежать - LOCK TABLE.

Автор: DENNN 17.11.2005, 18:25
Цитата(Ignat @ 17.11.2005, 16:16)
Цитата (Alexzander @ 17.11.2005, 15:52)
изменит значение LAST_INSERT_ID() для первой копии?

Изменит. Чтобы это избежать - LOCK TABLE.

Не изменит. Переменная LAST_INSERT_ID хранится на уровне соединения и на уровне соединиения обновляется после каждого запроса. Так что в пределах использования одного хендла соединения возвращается ПОСЛЕДНЕЕ значение автоинкремента, измененное при помощи УКАЗАННОГО хендла. То есть последнее изменение для твоего соединения, но не обязательно последнее для всей БД в целом.

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