# MS-SQL Server 2008  INSERT INTO  in eine Tabelle mit nur einem Feld, das IDENTITY ist



## GatewayToCode (15. September 2010)

Hallo,

ich habe ein Problem mit einer INSERT INTO - sql anweisung, bei der ich einen neuen Datensatz in eine Tabelle schreiben möchte, die:
  1. Nur ein einziges Feld besitzt
  2. Das Feld ist vom Typ BIGINT
  3. Das Feld hat die Eigenschaft [is Identity = True ] [ID-Ausgangswert = 1] [ID-Increment = 1]

Bei der PostgreSQL-Datenbank war das kein Problem, weil dort keine "Autowert"-Felder existieren, sondern das ganze über einen "externen Zähler" (SERIAL) funktioniert.

Mir wurde leider die PostgreSql-Datenbank unter dem hintern weggezogen und jetzt sitze ich auf einem Microsoft-SQL Server 2008 

Zum Vergleich schreibe ich beide INSERT Anweisungen hier rein:

PostgreSQL: 
INSERT INTO Tabellename VALUES( nextval('Tabellenname_id_seq') )

nextval('Tabellenname_id_seq') stellt die Automatisch incrementierte ID da, die ich von dem Zähler zurück bekomme.   

MS-SQL: 
INSERT INTO Tabellename VALUES()

MS-SQL Incrementiert Automatisch und Felder mit der Eigenschaft >>is IDENTITY<< dürfen nicht angegeben werden.
Wie aber bekomme ich jetzt in diese Tabelle einen neuen Datensatz?

Um die Frage vorweg zu nehmen: Warum brauche ich das, bzw warum mache ich das so? 
Nehmen wir an es gibt zwei Tabellen: "Projekt" 1------n "Projektdetail". "Projekt" ist meine Tabelle mit dem Schlüsselfeld und in "Projektdetail" befinden sich weitere Eigenschaften. In "Projektdetail" wird auch die Historie der Datensätze gespeichert, sodass eine ID mehrfach auftaucht, nur mit anderem Erstellungsdatum.

Ich hoffe mein Problem ist ersichtlich.

GatewayToCode


----------



## Bernd1984 (15. September 2010)

Hallo,

die von dir benutzte ID (Autoindex) in der Tabelle "Projekt" ist - wie von dir beschrieben - eindeutig.
Die Tabelle "Projektdetail" selber hat eine ID auch Autoindex. In der Tabelle "Projektdetail" ist die ID aus "Projekt" der Fremdschlüssel.

So könnte der Tabellenaufbau aussehen:
Tabelle Projekt
ProjektID|Feld1|Feld2

Tabelle Projektdetail
ProjektdetailID|ProjektID|Feld3|Feld4


----------



## GatewayToCode_ (15. September 2010)

Hallo Bernd1984,

Deine Aussage ist fast Richtig, nur mit dem Unterschied, das die Tabelle "Projekt" nur ein Feld besitzt welches zugleich das Autoindex-Feld ist.

Tabelle Projekt:
ProjektID

Tabelle Projektdetail:
ProjektdetailID|ProjektID|Feld3|Feld4 |...

Jetzt will ich eine Insert Into Anweisung für die Tabelle "Projekt" schreiben, die einfach einen neuen Datensatz anlegt.

Der Hacken: 
   INSERT INTO Tabellename VALUES() 
ist nicht zulässig.

GatewayToCode


----------



## Bernd1984 (16. September 2010)

Hallo,



GatewayToCode_ hat gesagt.:


> Der Hacken:
> INSERT INTO Tabellename VALUES()
> ist nicht zulässig.


Das ist ja auch korrekt, das du in ein Feld mit Autoindex nicht scheiben darfst.

Für mich macht es aber keinen Sinn, wenn du eine Tabelle hast, die nur aus einem Autoindex besteht, dann kannst du auch gleich auf die Tabelle verzichten. Da brauchst du nur in Projektdetails die letzte ProjektID ermitteln und 1 hochzählen. Das sollte man aber nur tun, wenn es keine Netzwerkfähige Anwendung ist.

Wenn die zu dem Projekt noch Daten in weiteren Feldern hast, kannst du diese füllen und denn die generierte ID (SELECT @@IDENTITY from Tabelle) in den Projektdetails als Fremdschlüssel verwenden.


----------

