【问题标题】:How can I make a SQL temp table with primary key and auto-incrementing field?如何制作带有主键和自增字段的 SQL 临时表?
【发布时间】:2011-05-21 22:24:53
【问题描述】:

我在这里缺少什么? 我试图让 ID 字段成为主键并自动递增,这样我就不需要显式插入它。

CREATE TABLE #tmp
(
ID INT IDENTITY(1, 1) ,
AssignedTo NVARCHAR(100),
AltBusinessSeverity NVARCHAR(100),
DefectCount int
);

insert into #tmp 
select 'user','high',5 union all
select 'user','med',4


select * from #tmp

我对这句话有误:

插入错误:列名或数量 提供的值与表不匹配 定义。

【问题讨论】:

  • 别偷懒,指定要插入的列。以后你会很感激的

标签: sql-server sql-server-2005 temp-tables


【解决方案1】:

据我所知,您只是缺少“主键”一词来满足您的指定目标。

对于您的其他列,最好明确定义它们应该是NULL 还是NOT NULL,这样您就不必依赖ANSI_NULL_DFLT_ON 设置。

CREATE TABLE #tmp
(
ID INT IDENTITY(1, 1) primary key ,
AssignedTo NVARCHAR(100),
AltBusinessSeverity NVARCHAR(100),
DefectCount int
);

insert into #tmp 
select 'user','high',5 union all
select 'user','med',4


select * from #tmp

【讨论】:

  • 身份列不需要PK。
  • @Sam - 他指定他想要它作为 PK。为什么你说它不应该是必要的?他可能很想要唯一约束强制执行,以及将其定义为 PK 时附带的聚集索引。
  • 我不想重复,所以我认为主键会很完美。我想稍后在 while 循环中使用它
  • @kacalapy - 尝试运行DROP TABLE #tmp 我怀疑你可能有一个旧版本搞砸了。
  • @Sam - 不了解你,但我正在回答以下问题 how can i make a sql temp table with primary key and autoincrmenting field? 你似乎回答了一半!
【解决方案2】:

您不插入身份字段。您需要指定字段名称并使用 Values 子句

insert into #tmp (AssignedTo, field2, field3) values (value, value, value)

如果你使用insert into... select field field field 它会将第一个字段插入到该身份字段中并会爆炸

【讨论】:

    【解决方案3】:

    如果您只是在做一些快速而肮脏的临时工作,您也可以跳过输入显式 CREATE TABLE 语句,而只需使用 SELECT...INTO 创建临时表并在选择列表中包含一个 Identity 字段。

    select IDENTITY(int, 1, 1) as ROW_ID,
           Name
    into #tmp
    from (select 'Bob' as Name union all
          select 'Susan' as Name union all
          select 'Alice' as Name) some_data
    
    select *
    from #tmp
    

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 2011-03-22
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2011-10-22
      • 2021-12-11
      • 1970-01-01
      • 2011-02-10
      相关资源
      最近更新 更多