Как вставить значения в две таблицы SQL Server, обновляющие первичный ключ и внешний ключ одновременно, с помощью процедуры?

#sql-server #foreign-keys #primary-key

Вопрос:

У меня есть что-то вроде этого:

 CREATE TABLE [dbo].[table1] 
(
    [id1] [int] IDENTITY(1,1) NOT NULL,
    [data] [varchar](255) NOT NULL,
    CONSTRAINT [PK_table1] PRIMARY KEY(id1) 
)

CREATE TABLE [dbo].[table2] 
(
    [id2] [int] IDENTITY(1,1) NOT NULL,
    [id1] [int] ,
    
    CONSTRAINT [PK_table2] PRIMARY KEY (id2)
    CONSTRAINT [FK_table2] FOREIGN KEY(id1) REFERENCES Table1
)
 

Я хочу добавить значения в обе таблицы с помощью процедуры. Я не добавляю никаких ключевых значений, только значения данных.

Если я использую INSERT INTO для добавления данных в таблицу 1, ее первичный ключ будет автоматически сохранен. Я также буду увеличивать таблицу 2 в той же процедуре.

Я хочу, чтобы автоматически созданный первичный ключ таблицы 1 автоматически обновлялся как внешний ключ в таблице 2 при выполнении этой процедуры.

Ответ №1:

Тебе нужно сделать что-то вроде этого:

 CREATE PROCEDURE dbo.InsertData (@data VARCHAR(255))
AS
BEGIN
    -- Insert row into table1
    INSERT INTO dbo.Table1 (data) VALUES (@data);
    
    -- Capture the newly generated "Id1" value
    DECLARE @NewId1 INT;
    SELECT @NewId1 = SCOPE_IDENTITY();
    
    -- Insert data into table2
    INSERT INTO dbo.table2 (Id1) VALUES (@NewId1);
END
 

Ответ №2:

Я не знаю, понимаю ли я, что ты хочешь сделать, но я думаю, что ты можешь сделать что-то вроде этого:

 INSERT INTO table1 (data) VALUES 'mydata'
DECLARE @LastKey INT
SET @LastKey = SCOPE_IDENTITY() -- FOR SQL SERVER, OR LAST_INSERT_ID() FOR MYSQL
INSERT INTO table2 (data) VALUES @LastKey
 

Комментарии:

1. Вам нужно поместить значения, которые вы вставляете, в круглые скобки — вот так: VALUES ('mydata') и т. Д.