Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.10;
Скачать: CL | DM;

Вниз

А как это делать правильнее и быстрее? (SQL)   Найти похожие ветки 

 
Behemoth ©   (2002-09-19 11:17) [0]

Например, есть две таблицы.
Первая (Clients): ID :Int (Автоинкрементное) и Name:String.
Вторая (Phones) : ID_Clients: int и Phone:String. Таблицы связаны по ID и ID_Clients. Задача заполнить их.

Делаю так: нахожу максимальный ID, прибавляю 1, потом
insert into Clients(ID,Name) Values (:MaxID,:Name)
insert into Phones (ID_Clients, Phone) Values (:MaxID,:Phone)
Так вот, записей, которых надо обновлять 150000, а полей, да и таблиц больше. В общем долго. Мож кто что предложит?


 
Андрей Прокофьев   (2002-09-19 11:20) [1]

Если поле AutoIncrement, то зачем искать максимальное значение


 
3JIA9I CyKA ©   (2002-09-19 11:31) [2]

Ку?

create table Clients (
ID int not null identity(1,1),
Name varchar(30) not null default "Чё-то",
constraint PK_Clients primary key nonclustered (ID)
)
go

create table Phones (
ID int not null,
Client_ID int not null,
Phone varchar(16) not null default "03",
constraint PK_Phones primary key nonclustered (ID),
constraint FK_Phones_Clients foreign key (Client_ID) references Clients (ID)
)
go

create procedure p_Jopa
@Name varchar(30),
@Phone varchar(10)
as
begin tran
declare @Client_ID int
insert into Clients (Name) values (@Name)
if @@error != 0 goto Err

select @Client_ID = @@identity

insert into Phones (Client_ID, Phone) values (@Client_ID, @Phone)
if @@error != 0 goto Err

commit tran
return
Err:
rollback tran
raiserror 50001 "Error, блин!"
go


 
Behemoth ©   (2002-09-19 11:31) [3]

А я не знаю как иначе. Какое значение писать во вторую таблицу?


 
3JIA9I CyKA ©   (2002-09-19 11:32) [4]

@@identity БЛН!


 
Behemoth ©   (2002-09-19 11:39) [5]

to 3JIA9I CyKA:
Поясни: select @Client_ID = @@identity
Что есть @@identity?


 
3JIA9I CyKA ©   (2002-09-19 11:42) [6]

Зайди в QA (кВеРи аНаЛайзЕр) и нажни F1 (Ф1).


 
Behemoth ©   (2002-09-19 11:43) [7]

to 3JIA9I CyKA:
Спасибо!!!!
Вроде дошло!


 
3JIA9I CyKA ©   (2002-09-19 11:45) [8]

8)


 
ЮЮ ©   (2002-09-19 11:46) [9]

1) убыстрение
StartTransaction<b/>
MaxID:=...(достаточно узнать один раз)
While not SourceQuery.EOF do
begin
inc(MaxID);
Insert1Queryparams.
[0].Value<b/>.:=MaxID;
Insert1Query.ExecSQL;
Insert2Query.params[0].Value:=MaxID;
Insert2Query.ExecSQL;
SourceQuery.Next;
end;
Commit<b/>

2) использовать те же ID, что и в исходной таблице и сделать всё одним запросом



 
Behemoth ©   (2002-09-19 11:51) [10]

to ЮЮ:
Записей 150000. В это время непрерывно идет обращение к базе со стороны других клиентов, которые тоже непрочь что-нить в нее вставить. По моему одна большая транзакция на полчаса чрезмерно загрузит базу


 
Behemoth ©   (2002-09-19 11:54) [11]

to ЮЮ:
Второй вариант точно не подходит из-за особенностей базы оригинала, да и обновляемой тоже.



Страницы: 1 вся ветка

Текущий архив: 2002.10.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
6-31923
SeF
2002-08-09 16:03
2002.10.10
HTTP


3-31594
a_smith
2002-09-17 14:36
2002.10.10
активный ADO connection при запуске аппликации


4-32081
Карлсон
2002-08-26 21:42
2002.10.10
как различить два окошка?


1-31703
Anar
2002-09-30 14:55
2002.10.10
Image


14-31942
lak_b
2002-09-13 23:05
2002.10.10
все хреново....