Как добавить данные в две таблицы, связанные через внешний ключ? - PullRequest
5 голосов
/ 25 июня 2009

Если бы у меня было 2 таблицы, назовите их TableA и TableB. TableB содержит внешний ключ, который ссылается на TableA. Теперь мне нужно добавить данные в TableA и TableB для данного сценария. Для этого сначала нужно вставить данные в TableA, затем найти и извлечь последний вставленный первичный ключ TableA и использовать его в качестве значения внешнего ключа в TableB. Затем я вставляю значения в таблицу B. Это похоже на большую часть работы только для вставки 1 набора данных. Как еще я могу достичь этого? Если возможно, пожалуйста, предоставьте мне операторы SQL для SQL Server 2005.

Ответы [ 3 ]

4 голосов
/ 25 июня 2009

Звучит примерно так. Обратите внимание, что вы можете использовать SCOPE_IDENTITY() для каждой строки или выполнять операции на основе набора, если вы используете синтаксис INSERT / OUTPUT, а затем присоединяете набор выходных данных из первой вставки - например, здесь мы только 1 ВСТАВКА (каждая) в «настоящие» таблицы:

/*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
1 голос
/ 25 июня 2009

Если вы собираетесь делать это в прямом SQL, я предлагаю создать хранимую процедуру, которая принимает все данные в качестве параметров, а затем выполняет шаги вставки / выбора идентификатора / вставки внутри транзакции. Несмотря на то, что процесс все тот же, что и для вставки вручную, использование хранимой процедуры позволит вам легче использовать ее из своего кода. Как упоминает @Rax, вы также можете использовать ORM для получения аналогичных функций.

1 голос
/ 25 июня 2009

Если вы работаете напрямую с SQL, у вас есть правильное решение.

Если вы выполняете вставку из кода, у вас могут быть структуры более высокого уровня, которые помогут вам достичь этого (LINQ, модели Django и т. Д.).

...