Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Исходные данные. В базе данных три таблицы, две из которых связаны с ключевым полем первой через ID.
Есть например модель со стат параметрами хранимыми в первой таблице и набор переменных параметров, хранимых в двух привязанных таблицах.
Подскажите как сделать копию модели, чтобы все параметры(*за исключением ключевого ID) остались неизменными, и появились в двух связных таблицах с привязкой к новому ID
Неактивен
поясните на примере
Неактивен
Как пример
INSERT INTO model (model_ryad,fabric,cat_id,note,hid)
SELECT model_ryad,fabric,cat_id,note,hid
FROM model
WHERE id = 21;
Я скопировал запись с ID = 21
Появлась точная(части описанных полей) копия данной записи, но с новым ИД (например = 100)
Все это в первой таблице.
Но по этому ID цепляются ещё таблицы...
Например таблица два
Model_ID(связка с первой таблицей), Model_parametr, Model_Value
Есть ещё таблица три, таким же образом через ID связана с первой таблицей.
Так вот в них так же есть по несколько полей с ID = 21 (к примеру)
Необходимо чтобы они так же скопировались и в своих ID имели значение = 100(новому ID из первой таблицы)
Неактивен
SELECT LAST_INSERT_ID(); -- сообщит id новой записи (например = 100)
INSERT INTO `вторая таблица` (Model_ID, Model_parametr, Model_Value)
SELECT FROM `вторая таблица` LAST_INSERT_ID(), Model_parametr, Model_Value WHERE id=21;
аналогично для третьей.
Неактивен
А одним запросом это возможно ?
Неактивен
да, например, вызвать хранимую процедуру, которая сделает 3 инсерта
Неактивен
А если говорить все же про одни запрос.
Насколько реально сделать это с помощью JOIN-а других таблиц
Неактивен
ни на сколько
Неактивен
А кто продиктовал такую необходимость сделать одним запросом? Если целостность нужна всех трёх - ну заверните в транзакцию.
Неактивен
SELECT LAST_INSERT_ID();
INSERT INTO `model_prametrs` (model_id, par_type, par_val)
SELECT FROM `model_prametrs` LAST_INSERT_ID(), par_type, par_val WHERE id=21;
Не прокатило
SELECT LAST_INSERT_ID(); выдает последний ИД а вот дальше ошибка Error Code: 1064
Неактивен
Да особой необходимости нет. Просто был интересен этот вопрос(можно или нет).
Неактивен
Earring написал:
Не прокатило
SELECT LAST_INSERT_ID(); выдает последний ИД а вот дальше ошибка Error Code: 1064
Неактивен
INSERT INTO `model_prametrs` (model_id, par_type, par_val)
Вставить в таблицу ИД Тип Значение
SELECT FROM `model_prametrs` LAST_INSERT_ID(), par_type, par_val WHERE id=21;
Выбранные из таблицы В этой таблице нет этого ид нужно только создать его на основе Типа и Значения которые соответствуют id=21
Не тут противоречие ?
И SELECT ? FROM на месте знака не нужно перечисление выбранных полей или * ?
Отредактированно Earring (28.11.2013 14:14:53)
Неактивен
Вроде победил
SELECT LAST_INSERT_ID();
INSERT INTO model_parametrs (model_id,par_type, par_val)
SELECT LAST_INSERT_ID(),par_type, par_val FROM model_parametrs WHERE model_id=21;
Неактивен
Остался последний вопрос - а зачем здесь первый запрос
SELECT LAST_INSERT_ID();
?
Неактивен
Да наверное собственно и не нужен.
Просто копия начального вашего
SELECT LAST_INSERT_ID(); -- сообщит id новой записи (например = 100)
INSERT INTO `вторая таблица` (Model_ID, Model_parametr, Model_Value)
SELECT FROM `вторая таблица` LAST_INSERT_ID(), Model_parametr, Model_Value WHERE id=21;
аналогично для третьей.
---------------------------------------------------
Вопрос. Есть поле Имя, сейчас получаются клоны записи с новым ИД но тем же именем, по большому ничего страшного, но, как вариант можно добавлять к имени или инкремент или идентификатор, например клон. И если оригинал назвался
Слон, то новое имя было или Слон1 итд, или Слон_Клон. Кстати в продложении можно ли выполнить эти запросы в цикле и добавить не один клон (это вопрос к инкременту как раз) а несколько ?
Неактивен
И ещё вопрос. А можно в имя взять не клон имени не составное имя а нужную мне переменную или константу допустим строковую ?
Неактивен
вместо имени подставляете константу или переменную.
в чем именно ваш вопрос?
Неактивен