Вставка SQL в связанные таблицы - PullRequest
8 голосов
/ 27 ноября 2008

Мне кажется, что это та проблема, которая постоянно возникает при разработке SQL / баз данных, но тогда я новичок во всем этом, так что прости мое невежество.

У меня есть 2 таблицы:

CREATE TABLE [dbo].[Tracks](
    [TrackStringId] [bigint] NOT NULL,
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Time] [datetime] NOT NULL,
 CONSTRAINT [PK_Tracks] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
        IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON,
        ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Tracks] CHECK CONSTRAINT [FK_Tracks_AudioStreams]
GO

ALTER TABLE [dbo].[Tracks]  WITH CHECK ADD  CONSTRAINT
[FK_Tracks_TrackStrings]     FOREIGN KEY([TrackStringId])
REFERENCES [dbo].[TrackStrings] ([Id])
GO

ALTER TABLE [dbo].[Tracks] CHECK CONSTRAINT [FK_Tracks_TrackStrings]
GO

и

CREATE TABLE [dbo].[TrackStrings](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [String] [nvarchar](512) NOT NULL,
 CONSTRAINT [PK_Strings] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
        IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON,
        ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Я хочу вставить новую запись в таблицу треков. Это также будет включать вставку новой записи в таблицу trackstrings и обеспечение того, чтобы столбец внешнего ключа trackstringid в track указывал на новую запись в trackstrings. Что является наиболее эффективным средством для достижения этого?

Ответы [ 3 ]

11 голосов
/ 27 ноября 2008

Сначала вставьте в TrackStrings, исключив столбец первичного ключа из списка столбцов. Это вызывает его столбец IDENTITY, который генерирует значение автоматически.

INSERT INTO [dbo].[TrackStrings] ([String]) 
  VALUES ('some string');

Во-вторых, вставьте в Tracks и укажите в качестве TrackStringId функцию SCOPE_IDENTITY(), которая возвращает самое последнее значение, сгенерированное IDENTITY столбцом в вашей текущей области действия .

INSERT INTO [dbo].[Tracks] ([TrackStringId], [Time]) 
  VALUES (SCOPE_IDENTITY(), CURRENT_TIMESTAMP());
7 голосов
/ 27 ноября 2008

Если вы используете SQL Server 2005 или более позднюю версию и вставляете много записей в один INSERT, вы можете просмотреть OUTPUT или OUTPUT INTO опции здесь , чтобы использовать идентификаторы из первая вставка во вторую без необходимости «заново находить» строки, чтобы получить все значения IDENTITY.

0 голосов
/ 27 ноября 2008

Первая вставка в основную таблицу.

INSERT INTO trackstrings VALUES('myvalue')

Далее получите личность. Этот метод зависит от того, делаете ли вы все это в 1 операторе, хранимой процедуре или каком-либо другом методе. Я приму 1 утверждение, поэтому просто вставлю специальную переменную identity.

INSERT INTO tracks VALUES( @@IDENTITY, getdate() )

Что-то подобное должно делать это в зависимости от вашего точного сценария. Ключ - это переменная @@ IDENTITY. Он содержит последнее вставленное значение идентификатора для соединения, которое вы используете. Это не таблица, это просто самая последняя идентификация, вставленная во время жизни соединений.

...