[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Транзакции и прочая ересь
RCuPeR
Добрый день.
Пытаюсь разобраться в транзакциях и остальных полезных плюшках MySQL, которые позволяют более-менее автоматизировать работу с данной СУБД.

И так. Первое, что меня интересует:
Возможно ли сделать так, что бы при добавлении новой строки в таблицу `users`, в таблицу `user_details` автоматически добавлялась новая строка, в которой поле 'user_id' хранит в себе id добавленной строки в `users` ?

Прилагается структура обеих таблиц:
Свернутый текст
--
-- Структура таблицы `users`
--

DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`pass` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

-- --------------------------------------------------------

--
-- Структура таблицы `user_details`
--

DROP TABLE IF EXISTS `user_details`;
CREATE TABLE IF NOT EXISTS `user_details` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`tel` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--
-- Ограничения внешнего ключа сохраненных таблиц
--

--
-- Ограничения внешнего ключа таблицы `users`
--
ALTER TABLE `users`
ADD CONSTRAINT `users_ibfk_1` FOREIGN KEY (`id`) REFERENCES `user_details` (`user_id`);

--
-- Ограничения внешнего ключа таблицы `user_details`
--
ALTER TABLE `user_details`
ADD CONSTRAINT `user_details_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`);


Мой вариант решения поставленной задачи:
START TRANSACTION;
INSERT INTO `users` VALUES ( NULL, 'Roman', SHA1('123') );
INSERT INTO `user_details` VALUES ( NULL, LAST_INSERT_ID(), NULL );
COMMIT;


Вернул ошибку:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`users`, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`id`) REFERENCES `user_details` (`user_id`)) 


Интересует мнение знатоков на этот счет, и альтернативные варианты решения задачи.



Спустя 14 минут, 7 секунд (26.03.2012 - 13:15) caballero написал(а):
INSERT INTO `users`(name,pass) VALUES ( 'Roman', SHA1('123') );
INSERT INTO `user_details` (user_id,tell)VALUES ( LAST_INSERT_ID(), NULL );

Спустя 4 минуты, 3 секунды (26.03.2012 - 13:19) RCuPeR написал(а):
Но, это два запроса. Все прелести автоматизации здесь нету.
Я не уверен, но, думаю, что можно как-то более интересней построить один запрос, который будет выполнять два действия.

Спустя 22 минуты, 33 секунды (26.03.2012 - 13:42) twin написал(а):
Цитата (RCuPeR @ 26.03.2012 - 10:19)
Но, это два запроса. Все прелести автоматизации здесь нету.
Я не уверен, но, думаю, что можно как-то более интересней построить один запрос, который будет выполнять два действия.

Действительно... Жизнь несовершенна. Когда построишь такой запрос поделись. А то я от тоже грею голову, как одним действием отвести ребенка в садик и музыкальную школу одним действием.

Спустя 16 минут, 17 секунд (26.03.2012 - 13:58) T1grOK написал(а):
Цитата (twin @ 26.03.2012 - 10:42)
как одним действием отвести ребенка в садик и музыкальную школу.

Когда найдешь способ, не забудь и со мной поделиться smile.gif

Спустя 12 минут, 2 секунды (26.03.2012 - 14:10) Игорь_Vasinsky написал(а):
RCuPeR
ну ты как будто про mysqli_multi_query() не знаешь.

стряпаешь запросов пучёк и одним запросом в БД.

Спустя 7 минут, 6 секунд (26.03.2012 - 14:17) twin написал(а):
Цитата (Игорь_Vasinsky @ 26.03.2012 - 11:10)
RCuPeR
ну ты как будто про mysqli_multi_query() не знаешь.

стряпаешь запросов пучёк и одним запросом в БД.

Тут речь об одном запросе, а не о пучке.

Спустя 1 час, 34 минуты, 5 секунд (26.03.2012 - 15:51) RCuPeR написал(а):
Пучек я транзакцией пускаю:
START TRANSACTION;
INSERT INTO `users` VALUES ( NULL, 'Roman', SHA1('123') );
INSERT INTO `user_details` VALUES ( NULL, LAST_INSERT_ID(), NULL );
COMMIT;


Но, до последнего надеялся, что можно как-то одним запросом сделать.

Спустя 18 минут, 48 секунд (26.03.2012 - 16:10) twin написал(а):
Транзакция тут излишня.

Спустя 21 минута, 27 секунд (26.03.2012 - 16:31) RCuPeR написал(а):
Это банальный пример.


_____________
Гнусный социопат с комплексом Бога.
Быстрый ответ:

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