我可以在select * into #temp_table时在临时表上添加主键吗?

时间:2018-05-29 09:27:12

标签: sql sql-server temp-tables

在存储过程中,我们首先截断事实表,然后插入数据。存储过程无论如何都会首先截断表,因此如果在将数据插入表时存在重复,则存储过程会因主键而失败。

TRUNCATE TABLE FactIncident

INSERT INTO FactIncident
    SELECT * FROM Source_table

所以我们最后没有表中的任何数据。所以我想做的是在执行

时首先将数据加载到带有主键的临时表中
SELECT * INTO #temp_table

然后截断并将数据从临时表加载到实际的事实表。是否可以在执行select * into #temp_table时添加主键,而不是通过定义create table #temp_table语法来创建主键?

4 个答案:

答案 0 :(得分:0)

不,我不认为你在insert into临时表时可以拥有主键。

但是如果你不想创建一个临时表,你仍然可以声明一个Table变量并使用它。 看看这个例子

declare @temp_table table (ID int primary key, name varchar(10))

insert into @temp_table values (1, 'Angela')
insert into @temp_table values (1, 'Jessica')

由于临时表上的主键

,第二个插入将失败
  

违反PRIMARY KEY约束' PK __#BD5C289__3214EC270D19E213'。   无法在对象' dbo。@ temp_table'中插入重复键。重复   关键值是(1)

修改
另一种方法是在select into之后更改临时表,并在列Pcolumn上添加主键约束。
如果添加主键失败,则表示您有重复项。

alter table #tempuser add constraint PK_TempPcolumn primary key (Pcolumn)

答案 1 :(得分:0)

我认为你需要身份专栏:

select identity(1,1) as ID, * into #temp_table
from table t;

然后你可以选择:

IF OBJECT_ID('TempDB..#temp_table') IS NOT NULL 
DROP TABLE #temp_table

CREATE TABLE #temp_table (Col1 INT PRIMARY KEY CLUSTERED, Col2 varchar(255), ... Col3)

答案 2 :(得分:0)

如果您这样做是为了避免插入重复项的错误,您是否可以忽略重复项?

TRUNCATE TABLE FactIncident

ALTER TABLE [FactIncident] REBUILD WITH (IGNORE_DUP_KEY = ON)
INSERT INTO [FactIncident] SELECT * FROM Source_table
ALTER TABLE [FactIncident] REBUILD WITH (IGNORE_DUP_KEY = OFF)

答案 3 :(得分:0)

尚未提供。因为表定义将由数据库引擎在内部创建。建议不要使用这样的T-SQL。

 SELECT * INTO #Temp FROM YourTable

在SQL Azure中不兼容。您必须首先创建临时表对象定义,您也可以在其中创建主键列。