在存储过程中,我们首先截断事实表,然后插入数据。存储过程无论如何都会首先截断表,因此如果在将数据插入表时存在重复,则存储过程会因主键而失败。
TRUNCATE TABLE FactIncident
INSERT INTO FactIncident
SELECT * FROM Source_table
所以我们最后没有表中的任何数据。所以我想做的是在执行
时首先将数据加载到带有主键的临时表中SELECT * INTO #temp_table
然后截断并将数据从临时表加载到实际的事实表。是否可以在执行select * into #temp_table
时添加主键,而不是通过定义create table #temp_table
语法来创建主键?
答案 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中不兼容。您必须首先创建临时表对象定义,您也可以在其中创建主键列。