2010-12-07 21 views
14

qu'est-ce qui me manque ici? Im essayant d'obtenir le champ d'identification pour être la clé primaire et l'incrément automatique de sorte que je n'ai pas besoin de l'insérer explicitement.comment puis-je faire une table temp sql avec clé primaire et champ auto-incrémenté?

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 

j'obtiens une erreur avec cette parole:

Insert Error: Column name or number of supplied values does not match table definition.

+0

Ne soyez pas paresseux, spécifiez les colonnes que vous souhaitez insérer. Vous apprécierez cela plus tard – SQLMason

Répondre

34

Vous manque seulement les mots « clé primaire » pour autant que je peux voir pour atteindre votre objectif spécifié.

Pour vos autres colonnes, il est préférable de définir explicitement si elles doivent être NULL ou NOT NULL bien que vous ne dépendiez pas du paramètre 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 
+0

PK ne devrait pas être nécessaire pour une colonne d'identité. – Sam

+0

@Sam - Il précise qu'il le veut comme le PK. Pourquoi dites-vous que cela ne devrait pas être nécessaire de toute façon? Il pourrait bien vouloir l'application de contrainte unique, et l'index en cluster qui vient avec le définir comme PK. –

+0

Je ne veux pas de dups, donc je pensais que la clé primaire serait parfaite. Je veux l'utiliser plus tard dans une boucle while – kacalapy

9

vous ne l'insérez pas dans les champs d'identité. Vous devez spécifier les noms de champs et utiliser la clause Valeurs

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

Si vous utilisez faire un insert into... select field field field il insérera le premier champ dans ce champ d'identité et bomberez

0

Si vous faites quelques-unes travail temporaire rapide et sale, vous pouvez également ignorer la saisie d'une instruction CREATE TABLE explicite et simplement créer la table temporaire avec un SELECT ... INTO et inclure un champ d'identité dans la liste de sélection.

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