2009-06-25 29 views
5

Nếu tôi có 2 bảng, hãy gọi chúng là TableA và TableB. TableB chứa một khóa ngoại, tham chiếu đến TableA. Bây giờ tôi cần thêm dữ liệu vào cả TableA và TableB cho một kịch bản nhất định. Để làm điều này, trước tiên tôi phải chèn dữ liệu vào TableA sau đó tìm và lấy khóa chính được chèn cuối cùng của TableA và sử dụng nó làm giá trị khóa ngoài trong TableB. Sau đó tôi chèn các giá trị trong TableB. Điều này có vẻ giống như một chút để làm việc chỉ để chèn 1 bộ dữ liệu. Làm cách nào khác tôi có thể đạt được điều này? Nếu có thể, vui lòng cung cấp cho tôi các câu lệnh SQL cho SQL Server 2005.Làm cách nào để thêm dữ liệu vào hai bảng được liên kết thông qua khóa ngoại?

Trả lời

4

Điều đó nghe có vẻ đúng. Lưu ý rằng bạn có thể sử dụng SCOPE_IDENTITY() trên cơ sở mỗi hàng hoặc bạn có thể thực hiện các hoạt động dựa trên thiết lập nếu bạn sử dụng cú pháp INSERT/OUTPUT và sau đó tham gia tập hợp đầu ra từ lần chèn đầu tiên - ví dụ, ở đây chúng tôi chỉ có 1 CHERTN (mỗi) vào các bảng "thực":

/*DROP TABLE STAGE_A 
DROP TABLE STAGE_B 
DROP TABLE B 
DROP TABLE A*/ 
SET NOCOUNT ON 

CREATE TABLE STAGE_A (
    CustomerKey varchar(10), 
    Name varchar(100)) 
CREATE TABLE STAGE_B (
    CustomerKey varchar(10), 
    OrderNumber varchar(100)) 

CREATE TABLE A (
    Id int NOT NULL IDENTITY(51,1) PRIMARY KEY, 
    CustomerKey varchar(10), 
    Name varchar(100)) 
CREATE TABLE B (
    Id int NOT NULL IDENTITY(1123,1) PRIMARY KEY, 
    CustomerId int, 
    OrderNumber varchar(100)) 

ALTER TABLE B ADD FOREIGN KEY (CustomerId) REFERENCES A(Id); 

INSERT STAGE_A VALUES ('foo', 'Foo Corp') 
INSERT STAGE_A VALUES ('bar', 'Bar Industries') 
INSERT STAGE_B VALUES ('foo', '12345') 
INSERT STAGE_B VALUES ('foo', '23456') 
INSERT STAGE_B VALUES ('bar', '34567') 

DECLARE @CustMap TABLE (CustomerKey varchar(10), Id int NOT NULL) 

INSERT A (CustomerKey, Name) 
OUTPUT INSERTED.CustomerKey,INSERTED.Id INTO @CustMap 
SELECT CustomerKey, Name 
FROM STAGE_A 

INSERT B (CustomerId, OrderNumber) 
SELECT map.Id, b.OrderNumber 
FROM STAGE_B b 
INNER JOIN @CustMap map ON map.CustomerKey = b.CustomerKey 

SELECT * FROM A 
SELECT * FROM B 
+0

Cảm ơn Marc ... đây chính xác là những gì tôi đang tìm kiếm ... Đó là dấu trang thường trực của tôi. –

1

Nếu bạn làm việc trực tiếp với SQL bạn có giải pháp đúng.

Trong trường hợp bạn thực hiện chèn từ mã, bạn có thể có cấu trúc cấp cao hơn giúp bạn đạt được điều này (LINQ, Mô hình Django, v.v.).

1

Nếu bạn định thực hiện điều này trong SQL trực tiếp, tôi khuyên bạn nên tạo một thủ tục lưu trữ lấy tất cả dữ liệu làm tham số, sau đó thực hiện chèn/chọn nhận dạng/chèn bước bên trong giao dịch. Mặc dù quá trình này vẫn giống như quy trình chèn thủ công của bạn, việc sử dụng quy trình được lưu trữ sẽ cho phép bạn dễ dàng sử dụng nó hơn từ mã của bạn. Vì @Rax đề cập đến, bạn cũng có thể sử dụng ORM để có được chức năng tương tự.

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