powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вставляем строки с формированием ключевого поля по ключу другой таблицы
9 сообщений из 9, страница 1 из 1
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32113912
VadimOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, All! Есть вопрос!
Простая ситуация. Есть таблица (table1) с autoincrement полем (field11) типа, к примеру, integer, которое одновременно является Primary key'ем. Есть другая таблица (table2), у которой тоже есть поле integer (field21), также используемое в качестве Primary key'я, и одновременно являющееся Foreign key'ем по полю field11 в таблице table1. Такая вот простенькая связь, к примеру, один к одному, не важно. Задача: Вставить гопом в таблицу table2 кучу строк. Вопрос: Кто какими методами пользуется? Разрешается все: триггеры, процедуры, но желательно в стиле ASE. Спасибо всем заранее
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32113919
VadimOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняйте. Слово "гопом" обозначает "одним запросом" :)
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32113954
Фотография cvasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда нужно вставлять (с клиента или из другой таблицы)?
И что значит "одним запросом"? insert ... select ... ?
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32114120
VadimOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запросом INSERT INTO ... SELECT FROM ....
Конкретная задача такая - перенести данные из таблиц датабазы на Access в таблицы датабазы на ASA или ASE. Структура таблиц, разумеется, разная. Ключевые поля при записи данных должны формироваться на принимающей стороне автоинкрементом. Наиболее важный момент - скорость переноса данных
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32114573
Фотография cvasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> "Ключевые поля при записи данных должны формироваться на принимающей стороне автоинкрементом"
Т.е. получается что в аксессе ключевых полей нет? Или все-таки есть?
И откуда взялось требование вставки через INSERT INTO ... SELECT FROM ....?
IMHO выгрузить данные из аксеса в текстовые файлы и потом загрузить в сайбэйз через bcp было бы быстрее.
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32115130
VadimOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я, конечно, могу рассказать все предысторию вопроса, но для данной конкретной задачки это совсем неважно. Подойдем к ней более абстрактно.

Итак, задачка.
Есть table1. Ее задача - формировать и хранить глобальные идентификаторы неких объектов. Как формировать идентификаторы? Допустим автоинкрементом. Далее. Есть несколько других таблиц (table11, table12, table13 ...), в которых и лежат собственно эти объекты. В каждой таблице - свой тип объектов. Идентификатором каждого объекта является идентификатор из таблицы table1.

Нужно заполнить эти таблицы объектов из некоего абстрактного хранилища. Пофигу, есть там свои идентификаторы у объектов в этом хранилище или нет. Может есть, может нет, а если и есть, то там они свои, и нас не интересуют. Важно только, что список объектов каждого типа из этого хранилища можно заполучить с помощью SELECT'a.

Способ раз: рисуем процедуру, в которой получаем курсор на нужную коллекцию объектов, перебираем их по очереди, для каждого получаем из table1 идентификатор и сохраняем объект с этим идентификатором в соответствующей этому объекту таблице.

Способ два: рисуем для каждой из таблиц table11, table12 и т.д. триггер, который перед вставкой объекта в соответствующей таблице получает идентификатор этого объекта из table1. В этом случае все объекты в нужную таблицу можно запихнуть одним запросом типа INSERT INTO ... SELECT FROM... Мне этот способ кажется более элегантным, чем первый.

Вот и хотелось бы выяснить, существует ли третий способ, такой же элегантный, как второй, но... по-другому. Ну, может без использования триггеров. Скажем, для бесплатной версии MySQL, в которой, как известно, триггерами не пахнет.

ЗЫ Интересно, а есть все-таки в Access'е ключевые поля? Или нет? :-)
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32115179
Фотография cvasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Способ раз ...
С этим все понятно

> Способ два ... триггер, который перед вставкой объекта в соответствующей
> таблице получает идентификатор этого объекта из table1

А вот здесь не ясно как (на основании чего) триггер будет связывать объект с
его идентификатором.
Если критерий для этого все-таки имеется, то можно просто загрузить данные
в таблицы 11, 12, 13 ... не специфицируя идентификаторы, а потом уже
связать их с table1 отдельным апдэйтом.
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32115653
VadimOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, в качестве примера для ASA можно предложить следующее:

table1:

CREATE TABLE "DBA"."table1"
(
"OBJECT_ID" integer NOT NULL DEFAULT autoincrement,
"OBJECT_TYPE" char(20) NOT NULL DEFAULT 0,
PRIMARY KEY ("OBJECT_ID") WITH HASH SIZE 10
)

table11:

CREATE TABLE "DBA"."table11"
(
"OBJECT_ID" integer NOT NULL,
"OBJECT_NAME" char(20) NULL DEFAULT 'ObjName',
PRIMARY KEY ("OBJECT_ID") WITH HASH SIZE 10
)

Связываем table1 и table11:

ALTER TABLE "DBA"."table11"
ADD FOREIGN KEY "table1_fk" ("OBJECT_ID")
REFERENCES "DBA"."table1" ("OBJECT_ID") on delete cascade on update cascade WITH HASH SIZE 10

Добавляем для table11 триггер:

create trigger dba.add_object before insert order 1 on
DBA.table11
referencing new as new_object
for each row
begin
insert into DBA.table1(OBJECT_TYPE) values('Type1');
set new_object.OBJECT_ID=@@identity
end

Теперь в принципе можно для теста выполнить что-то типа:

INSERT INTO "DBA"."table11" ( OBJECT_NAME ) VALUES ( 'MyName' )

но в принципе можно попробовать и INSERT INTO "DBA"."table11" SELECT FROM ...
...
Рейтинг: 0 / 0
Вставляем строки с формированием ключевого поля по ключу другой таблицы
    #32116033
Фотография cvasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Криво это все как-то. Даже с точки зрения нормализации.
Зачем вообще нужно разделять объекты на разные таблицы.
Не проще ли свалить все в одну, в которую добавить поле
типа объекта. А если надо потом их по типам разделять (например из
соображений безопасности) использовать вью.

Впрочем, это мое личное мнение.
Подробностей почему Вы делаете именно так я ведь не знаю.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вставляем строки с формированием ключевого поля по ключу другой таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]