2010-07-14 42 views
7

Tôi sẽ đưa ra một ví dụ giả mã của phương pháp hiện tại của tôi và nếu có ai biết về một phương pháp không hoạt động một hàng tại một thời điểm, tôi sẽ khá cảm kích. Tôi đang sử dụng MS SQL Server 2008.Có cách nào để chèn hàng loạt vào hai bảng với FK từ một đến khác?

define cursor for the data to be inserted (about 3 million records) 
loop 
(
    insert record into table 1 
    use scope_identity() to get key 
    insert record into table 2 that references table 1 
) 

tôi đã nhiều hơn làm một số loại chèn vào cả hai bảng cùng một lúc vì một con trỏ và vòng lặp là chậm.

Trước khi mọi người rants về lý do tôi chèn thứ gì đó vào hai bảng riêng biệt có mối quan hệ 1-1, đó là vì bảng đầu tiên không thể sửa đổi được và tôi cần thông tin trong bảng thứ hai (tạm thời) để tham khảo dữ liệu hoạt động chuyển đổi sau này.

Không, tôi không thể thêm cột tạm thời để giữ dữ liệu tham chiếu vào bảng không thể sửa đổi được vì không thể sửa đổi được. Đây là một hệ thống trực tiếp và tôi không có quyền thay đổi bảng.

Cảm ơn!

Thông tin bổ sung:

Ex

Source: 

1 a big monkey 
2 a tall elephant 
3 a big giraffe 
4 a tiny cow 
5 a tall cow 

Dest: 

Table 1  Table 2 
monkey  1 big 
elephant  2 tall 
giraffe  3 big 
cow   4 tiny 
cow   5 tall 
+1

[Câu trả lời này có hữu ích không?] (Http://stackoverflow.com/q/5365629/73226) –

Trả lời

0

Với nhiều dữ liệu, lựa chọn tốt nhất có thể để cô lập thông tin cập nhật trên hệ thống, cho phép identity insert và prepoulate các phím trước khi chèn.


Hoặc, bạn có thể thực hiện thao tác chèn đầu tiên, sau đó sửa đổi chèn cho lần thứ hai (từ bảng tạm thời) để tham gia vào dữ liệu gốc và tìm khóa.

+0

Ý tưởng tuyệt vời và cảm ơn bạn, nhưng ... Tôi không thể sửa đổi bảng đầu tiên cho phép chèn thông tin nhận dạng. Ý tưởng thứ hai sẽ là hoàn hảo nhưng lý do tôi cần bảng thứ hai với khóa ngoài là thứ nhất vì dữ liệu tôi chèn vào đầu tiên không chứa bất kỳ thứ gì để làm cho mỗi bản ghi duy nhất. Bảng đích thứ hai về bản chất sẽ chứa danh tính của bảng nguồn. Xem thông tin bổ sung mà tôi đã thêm vào câu hỏi. – AppFzx

+2

Bạn không cần phải * sửa đổi * bảng để cho phép chèn thông tin nhận dạng - bạn chỉ cần gắn khung câu lệnh chèn của mình với SET IDENTITY_INSERT ON và SET IDENTITY_INSERT OFF. –

0

Sử dụng IDENTITY_INSERT, VIEW và bộ kích hoạt INSTEAD OF và các giá trị nhận dạng được chèn sẵn với chèn của bạn.

See this SQL Fiddle.

Tôi đã cố gắng giải quyết các thứ khác nhau trong bộ kích hoạt INSTEAD OF để cho cột nhận dạng của T1 được sử dụng cho T2, nhưng cuối cùng tôi đã thất bại.

0
insert into table1 
select substring(src.data, 8 /* assuming fixed length as exampled */, len(src.data)) 
from source src 

insert into table2 
select t1.id, substring(src.data, 3 /* skip 'a ' */, 7) 
from 
    table1 t1 
     inner join source src 
     on substring(src.data, 8, len(src.data)) = t1.data 

Đối với ví dụ được đưa ra, tôi không thể làm tốt hơn ...

+0

Ah! Chỉ mục trên t1 (dữ liệu, id) có thể giúp ... –

1

Bạn có thể sử dụng merge trên Table1 và và output vào Table2.

merge Table1 
using SourceTable 
on 0 = 1 
when not matched then 
    insert (Animal) values (SourceTable.Animal) 
output inserted.ID, SourceTable.Size into Table2(ID, Size); 

SQL Fiddle

Lưu ý: NếuTable2 có một chìa khóa nước ngoài quy định chống lại Table1 bạn không thể làm sản lượng trực tiếp đến Table2. Trong trường hợp đó, bạn có thể sử dụng bảng tạm thời làm mục tiêu của đầu ra và chèn vào Table2 từ bảng tạm thời.

Các vấn đề liên quan