SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.11.2013 11:13:48

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Копия

Добрый день.
Исходные данные. В базе данных три таблицы, две из которых связаны с ключевым полем первой через ID.
Есть например модель со стат параметрами хранимыми в первой таблице и набор переменных параметров, хранимых в двух привязанных таблицах.
Подскажите как сделать копию модели, чтобы все параметры(*за исключением ключевого ID) остались неизменными, и появились в двух связных таблицах с привязкой к новому ID

Неактивен

 

#2 28.11.2013 11:21:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

поясните на примере

Неактивен

 

#3 28.11.2013 12:04:53

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

Как пример

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 из первой таблицы)

Неактивен

 

#4 28.11.2013 12:27:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

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;

аналогично для третьей.

Неактивен

 

#5 28.11.2013 12:29:19

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

А одним запросом это возможно ?

Неактивен

 

#6 28.11.2013 12:30:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

да, например, вызвать хранимую процедуру, которая сделает 3 инсерта smile

Неактивен

 

#7 28.11.2013 12:58:41

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

А если говорить все же про одни запрос.
Насколько реально сделать это с помощью JOIN-а других таблиц

Неактивен

 

#8 28.11.2013 13:03:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

ни на сколько

Неактивен

 

#9 28.11.2013 13:09:42

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Копия

А кто продиктовал такую необходимость сделать одним запросом? Если целостность нужна всех трёх - ну заверните в транзакцию.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#10 28.11.2013 13:29:07

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

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

Неактивен

 

#11 28.11.2013 13:31:15

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

Да особой необходимости нет. Просто был интересен этот вопрос(можно или нет).

Неактивен

 

#12 28.11.2013 13:51:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

Earring написал:

Не прокатило
SELECT LAST_INSERT_ID(); выдает последний ИД а вот дальше ошибка Error Code: 1064

MySQL error 1064

Неактивен

 

#13 28.11.2013 14:10:22

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

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)

Неактивен

 

#14 28.11.2013 14:17:36

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

Вроде победил
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;

Неактивен

 

#15 28.11.2013 14:23:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

Остался последний вопрос - а зачем здесь первый запрос
SELECT LAST_INSERT_ID();
?

Неактивен

 

#16 28.11.2013 15:21:31

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

Да наверное собственно и не нужен.

Просто копия начального вашего
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 итд, или Слон_Клон. Кстати в продложении можно ли выполнить эти запросы в цикле и добавить не один клон (это вопрос к инкременту как раз) а несколько ?

Неактивен

 

#17 28.11.2013 15:34:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Неактивен

 

#18 28.11.2013 16:11:00

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

И ещё вопрос. А можно в имя взять не клон имени не составное имя а нужную мне переменную или константу допустим строковую ?

Неактивен

 

#19 28.11.2013 16:27:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

да

Неактивен

 

#20 28.11.2013 16:45:33

Earring
Участник
Зарегистрирован: 28.11.2013
Сообщений: 14

Re: Копия

Каким образом ?

Неактивен

 

#21 28.11.2013 16:49:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Копия

вместо имени подставляете константу или переменную.
в чем именно ваш вопрос?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson