Пытаюсь разобраться в транзакциях и остальных полезных плюшках 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) |
как одним действием отвести ребенка в садик и музыкальную школу. |
Когда найдешь способ, не забудь и со мной поделиться

Спустя 12 минут, 2 секунды (26.03.2012 - 14:10) Игорь_Vasinsky написал(а):
RCuPeR
ну ты как будто про mysqli_multi_query() не знаешь.
стряпаешь запросов пучёк и одним запросом в БД.
ну ты как будто про 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 написал(а):
Это банальный пример.
_____________
Гнусный социопат с комплексом Бога.