Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 390
от 25.10.2008, 10:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 421, Экспертов: 33
В номере:Вопросов: 1, Ответов: 2

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 147822: Помогите с запросом копирования записи в пределах таблицы. Нужно по уникальному полю ID скопировать запись и присвоить новое значение для поля ID. Вот мое решение но оно слишком громоздко, т.к. нужно перечислять все поля таблицы. А если добавятся еще...

Вопрос № 147.822
Помогите с запросом копирования записи в пределах таблицы. Нужно по уникальному полю ID скопировать запись и присвоить новое значение для поля ID. Вот мое решение но оно слишком громоздко, т.к. нужно перечислять все поля таблицы. А если добавятся еще поля это придется переписывать весь запрос.
Код:

INSERT INTO Profession (ID, Lang, Base, ... и тд)
SELECT :NewID, P.Lang, P.Base, ... и тд
FROM Profession AS P
WHERE P.ID=:ID

Заранее спасибо!
Отправлен: 20.10.2008, 10:14
Вопрос задал: LEXASOFT (статус: 8-ой класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Командин Константин Евгениевич
Здравствуйте, LEXASOFT!
Если поле ID у вас автоинкриментируется то возможно подойдет вариант когда вы просто не будете в Insert указывать ID и в Select, тогда новый ID сам сформируется сам

INSERT INTO Profession (Lang, Base, ... и тд)
SELECT P.Lang, P.Base, ... и тд
FROM Profession AS P
WHERE P.ID=:ID
Ответ отправил: Командин Константин Евгениевич (статус: 4-ый класс)
Ответ отправлен: 20.10.2008, 10:36
Оценка за ответ: 4
Комментарий оценки:
Проблема в том что мне нужно указать ID который сгенерирован генератором! Без указания всех полей, т к поля могут добавляться!

Отвечает: Примак Руслан Николаевич
Здравствуйте, LEXASOFT!

К сожалению, Вы не указали для какого сервера БД Вам требуется решить эту задачу.
Предложу Вам способ, которым пользуюсь для БД MySQL 5.1. Сразу скажу для Firebird 1.5 он не работает, а для других БД я не проверял.
Особенность языка MySQL 5.1 позволяет выполнить запрос типа:

insert into test (select * from test where ID = 1)

Этот способ позволяет вставить одну и БОЛЕЕ!!! записей подходящих по условию where.
Проблема заключается в том, что при такой вставке для ключевого поля устанавливается такое же значение как и у копируемой записи. Чтобы этого избежать, необходимо:
1) Использовать автоинкремент для ключевого поля.
2) Создать триггер, который бы обеспечивал выполнение условия автоинкремента:
CREATE TRIGGER BI_KEY_TEST BEFORE INSERT ON test
FOR EACH ROW
set New.id = 0

Это что касается MySQL 5.1, на более ранних версиях работать не будет.

Что же касается других БД, то можно пойти программным путем. В приложении указан код Delphi, который выполняет копирование таблицы из одной БД в другую.
TablesCbx - комбобокс с именам таблиц
AddQueryCondMemo - Memo - в котором я указываю дополнительные условия запроса из исходной БД.

К сожалению, пока не могу приложить проект к ответу, что-бы было более понятно.

Приложение:

Ответ отправил: Примак Руслан Николаевич (статус: 4-ый класс)
Ответ отправлен: 20.10.2008, 11:34
Оценка за ответ: 5
Комментарий оценки:
Действительно забыл указать что база Firebird. insert into test (select * from test where ID = 1) не устраивает. Т. к. мне нужно знать какой ID у записи, нужно скопировать все записи из подчиненных таблиц. Видимо придется указывать все поля :(


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.6 от 14.10.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru
RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

В избранное