INSERT INTO временную таблицу и создать поле IDENTITY без предварительного объявления временной таблицы?

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

Столбцы IDENTITY обеспечивают согласованность действий нескольких пользователей. ПЕРВИЧНЫЙ КЛЮЧ делает вещи эффективными. Используйте оба для максимального эффекта.

Amy B 24.09.2008 00:28
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
43
1
143 839
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

IIRC, команда INSERT INTO использует схему исходной таблицы для создания временной таблицы. Это одна из причин, по которой вы не можете просто попытаться создать таблицу с дополнительным столбцом. Столбцы удостоверений внутренне привязаны к конструкции SQL Server, называемой генератором.

Ответ принят как подходящий

О маловерные:

SELECT *, IDENTITY( int ) AS idcol
  INTO #newtable
  FROM oldtable

http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx

Но, конечно, двух не может быть. Просто не выбирайте идентификатор col как часть запроса

Matt Rogish 24.09.2008 00:54

Необходимо соблюдать осторожность, если вы используете предложение ORDER BY и ожидаете, что "idcol" будет в том же порядке. support.microsoft.com/kb/273586

mg1075 04.10.2011 22:28

выберите cast (CurrentID as int) в качестве CurrentID, вам это должно понравиться, если oldtable имеет столбец идентификаторов

Savas Adar 05.02.2014 21:58

Вы можете сделать Select Into, который на лету создаст структуру таблицы на основе выбранных вами полей, но я не думаю, что это создаст для вас поле идентификации.

Чтобы сделать вещи эффективными, вам нужно объявить, что один из столбцов является первичным ключом:

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)

Это не будет принимать переменную для имени столбца.

Поверьте мне, вам НАМНОГО лучше сделать: CREATE #myTable TABLE (или, возможно, DECLARE TABLE @myTable), который позволяет вам напрямую устанавливать IDENTITY и PRIMARY KEY.

По-разному; вставки в индексированную таблицу (за некоторыми исключениями) медленнее, чем в неиндексированной таблице из-за обслуживания дерева B +; у этого приложения может не быть достаточно данных, загруженных во временную таблицу, чтобы индекс имел смысл. Полностью зависит от ситуации, и у нас недостаточно информации, чтобы знать

Matt Rogish 24.09.2008 00:58

Он хочет «идентичности», чтобы «делать вещи эффективными». Мы можем сделать вывод, что он хотел бы получить доступ к элементам по идентификатору, который еще не существует. Легко отсортировать по идентификатору, которого еще нет.

Amy B 24.09.2008 01:53

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

Matt Rogish 24.09.2008 03:19

Вы прокомментировали: не работает, если в oldtable есть столбец идентификаторов.

Думаю, это ваш ответ. #Newtable автоматически получает столбец идентификаторов из oldtable. Выполните следующие инструкции:

create table oldtable (id int not null identity(1,1), v varchar(10) )

select * into #newtable from oldtable

use tempdb
GO
sp_help #newtable

Это показывает, что в #newtable есть столбец идентификаторов.

Если вам не нужен столбец идентификаторов, попробуйте это при создании #newtable:

select id + 1 - 1 as nid, v, IDENTITY( int ) as id into #newtable
     from oldtable

Хороший вопрос и Мэтт был хорошим ответом. Чтобы немного расширить синтаксис, если старая таблица имеет идентификатор, пользователь может выполнить следующее:

SELECT col1, col2, IDENTITY( int ) AS idcol
INTO #newtable
FROM oldtable

Это было бы, если бы старая таблица была написана как-то так:

CREATE TABLE [dbo].[oldtable]
(
    [oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [col1] [nvarchar](50) NULL,
    [col2] [numeric](18, 0) NULL,
)

Если вы хотите включить столбец, который является текущим идентификатором, вы все равно можете это сделать, но вам нужно явно указать столбцы и преобразовать текущее удостоверение в int (при условии, что он сейчас один), например:

select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID 
into #temp
from myserver.dbo.mytable

Если после * вы укажете псевдоним столбца id, который нарушает запрос во второй раз ... и дадите ему новое имя ... он волшебным образом начнет работать.

select IDENTITY( int ) as TempID, *, SectionID as Fix2IDs
into #TempSections
from Files_Sections

Другие вопросы по теме