# Identitätsspalte kann nicht aktualisiert werden



## speedy_g (13. Feb 2009)

Hallo,

Ich hab eine MS SQL Datenbank (SQL Server Express 2008) und steuer die aus Java an mit dem 2005er Treiber. Java ist die Version 6 und ich entwickel unter Eclipse.

Klappt auch wunderbar.

Ich bastel grad so bißchen zum Üben von Java & der DB Anbindung, weil ich auch grad erst mit Java anfange, nen kleinen Datenbank Editor - also nur für paar wichtige Sachen.

Jetzt wollt ich eine AutoIncrement Spalte in die Tabelle einfügen - gemacht getan - wird angelegt.

Nun schreibe ich eine Zeile in die Tabelle. Es kommt obiger Fehler "Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden."

Hier mal das Create:


```
CREATE TABLE TestTabelle ( Spalte1 INT CONSTRAINT pk_Spalte1_1234489708313 PRIMARY KEY IDENTITY(1,1) NOT NULL, Spalte2 VARCHAR(256) NULL );
```

und hier das Insert:


```
INSERT INTO TestTabelle (Spalte2) VALUES ('String18');
```


In Java verwende ich vom Statement den Batch-Mechanismus, um die Zeilen erstmal zum Batch hinzu zu fügen und dann auszuführen. Einzeln oder zusammen - funktioniert beides nicht.

Beim m_Statement.executeBatch(); wird die SQLException geschmissen.

Wenn ich aber nun das Insert-Statement direkt im SQL Server Manager ausführe, dann funktioniert sie.


Und jetzt kommt der Hammer - bevor ich den Code für das Erstellen des Insert-Statements geändert habe - also das war einfach nur ein anderer Algorithmus (die for-Schleifen sahen bißchen anders aus), wo dann das gleiche Statement bei rauskam (der alte Algorithmus hatte nur nen Problem, wenn die AutoIncrement-Spalte die letzte Spalte war) ... jedenfalls bin ich der Meinung nur das geändert zu haben ... na jedenfalls .... davor hatte es funktioniert.

Ich hab das schon auf Tabellen getestet, wo es vorher funktioniert hatte, auf neue Tabellen und in einer neuen Datenbank. Selbst nen Windows-Neustart half nichts. 

.... und jetzt sitz ich hier schon paar Stunden und grübel vor mich hin, was ich denn da jetzt falsch/anders mache.


Jemand ne Idee, was ich noch ausprobieren könnte ?

Ich denke mal, irgendwelchen Source zu posten bringt nicht wirklich was - weil die Statements sind ja eigentlich richtig. Wenn ich doch was posten kann, dann sagt es bitte.


MFG,
speedy


----------



## HoaX (13. Feb 2009)

mal probiert für spalte1 einfach null im insert einzufügen?


----------



## speedy_g (13. Feb 2009)

> mal probiert für spalte1 einfach null im insert einzufügen?



Ne, funktioniert nicht. 

Ich hab dann eben nochmal eine kleine Testreihe durchgeführt - jetzt wirds so richtig mysteriös denke ich.

Ausgangszustand - in der Tabelle ist eine Zeile inkl. AutoIncrement drin, weil durch den MS SQL Server Manager mit dem Statement eingefügt. Spalte1 hat den Wert 1, Spalte2 den Wert "String123".

Also erstmal der Vorschlag:

INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (0,'Zeile2');

Kommt jenes:
 Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.

Dann ...

 INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (1,'Zeile2');

Kommt ...
 Ein expliziter Wert für die Identitätsspalte kann nicht in der 'TestTabelle'-Tabelle eingefügt werden, wenn IDENTITY_INSERT auf OFF festgelegt ist.

Jetzt sehe ich auf einmal, der Wert in obiger Zeile 1 hat sich von "String123" auf "Zeile2" geändert.

Also nochmal verifiziert....

 INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (1,'Zeile277777');

Kommt wieder jenes ....
Ein expliziter Wert für die Identitätsspalte kann nicht in der 'TestTabelle'-Tabelle eingefügt werden, wenn IDENTITY_INSERT auf OFF festgelegt ist.

Aber der Wert der Spalte2 wurde von "Zeile2" auf "Zeile277777" gesetzt.

Nun also mal jenes ausprobiert....

SET IDENTITY_INSERT TestTabelle ON;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (1,'Zeile999');

Kommt logischerweise das....
Verletzung der PRIMARY KEY-Einschränkung 'pk_Spalte1_1234489708313'. Ein doppelter Schlüssel kann in das 'dbo.TestTabelle'-Objekt nicht eingefügt werden.

Aber der Wert der Spalte2 wurde von "Zeile277777" auf "Zeile999" gesetzt.

Als nächstes...

SET IDENTITY_INSERT TestTabelle ON;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (0,'Zeile555');

Kommt...
Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.

Und die Zeile 1 mit "Zeile999" drin wurde Erwartungsgemäß nicht geändert.

Nun jenes getestet....

SET IDENTITY_INSERT TestTabelle ON;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (2,'Zeile444');

Die Zeile wird ohne zu meckern eingefügt.

Also nochmal ne Chance geben...

SET IDENTITY_INSERT TestTabelle OFF;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (0,'Zeile333');

Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.

Es wurde auch nichts eingefügt.



MFG,
speedy


----------



## speedy_g (13. Feb 2009)

Grad nochmal die Antwort von HoaX kapiert bzw. nochmal getestet.

Also jenes...

SET IDENTITY_INSERT TestTabelle OFF;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (NULL,'Zeile222');

Dann kommt jenes...

DEFAULT und NULL sind nicht als explizite Identitätswerte zulässig.

Und es wird auch nichts eingefügt - ist ja auch logisch. Die Spalte wurde ja auf "NOT NULL" gesetzt bzw. ist das "NOT NULL" setzen der Spalte eine Voraussetzung dafür, daß die Tabelle angelegt wird ... aber klar - ein Versuch war es Wert.


MFG,
speedy


----------



## speedy_g (13. Feb 2009)

Nochmal die Chance ohne Spalte1 ...

SET IDENTITY_INSERT TestTabelle OFF;
INSERT INTO TestTabelle (Spalte2) VALUES ('Zeile111');

 Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.


Die Meldung auf Englisch ist übrigens jene: (aus einer Group kopiert)

Server: Msg 8102, Level 16, State 1, Line 1 
Cannot update identity column 'b'.

Aber mehr als die deutsche verrät die mir auch nicht.


MFG,
speedy


----------



## speedy_g (13. Feb 2009)

Jetzt wird doch der Hahn in der Pfanne verrückt  :shock: - aber nicht wirklich mit Erfolg. 

Also hab eben jenes gemacht:

CREATE TABLE TestTabelle2 ( Spalte1 INT CONSTRAINT pk_Spalte1_1234523474765 PRIMARY KEY NOT NULL, Spalte2 INT IDENTITY(1,1) NOT NULL );

INSERT INTO TestTabelle2 (Spalte1) VALUES (1);

Es kommt:
Die 'Spalte2'-Identitätsspalte kann nicht aktualisiert werden.

Ich hab beide Befehle in einem Batch-Job Statement ausgeführt, wobei ich beide Zeilen separat hinzugefügt habe.

Jetzt das verrückte - die Zeile ist drin und der AutoIncrement auf 1 gesetzt.  :shock: - trotz Fehlermeldung.

Also gleich noch paar Zeilen versucht hinzu zu fügen - hat nicht funktioniert. 


Also reproduziert - neue Tabelle mit einer Zeile zusammen in einem Batch-Job .... funktioniert - aber mit Fehlermeldung.

Nochmal reproduziert - neue Tabelle jetzt ganz mutig mit 3 Zeilen - alles in einem Batch-Job .... funktioniert - das Increment wird jeweils hochgesetzt - aber trotzdem kommt die Fehlermeldung.  :shock: 

Eine weitere Zeile hinzugefügt in einem separaten Batch-Job - nur die Fehlermeldung.


MFG,
speedy


----------



## speedy_g (13. Feb 2009)

Hmm, niemand ne Idee ?

Ich wär auch für Überlegungen ala "Ist der Computer eingeschaltet" dankbar - also auf Java-Ebene natürlich  Bin doch Anfänger bei Java und vielleicht hab ich ja einfach was vergessen zu machen.


MFG,
speedy


----------



## maki (13. Feb 2009)

Schau dir die Tabllenen Def. doch mal im Enterprise Manager an, ob da wirklich nur die 1. Spalte als Autoinkrement defniert ist.


----------



## speedy_g (13. Feb 2009)

Ja - ist sie.

Also ich hab inzwischen eine Tabelle zum Testen, wo die erste Spalte der Primary Key ist und die zweite Spalte der AutoIncrement.

Wird auch so im Manager angezeigt.

Direkt im Manager funktioniert es ja auch immernoch problemlos mit den Statements. 


MFG,
speedy


----------



## speedy_g (13. Feb 2009)

Nein, ich sag nicht woran es gelegen hat. Das ist einfach zu peinlich.   

Typischer Fall von !(Mein Code macht das was ich will) und dem ganzen grünen Zeug im Wald.  


MFG,
speedy


----------



## maki (13. Feb 2009)

Andere Methode aufgerufen / falsche Version "getestet"?


----------



## speedy_g (14. Feb 2009)

Eine andere Methode hat mehr gemacht, als sie sollte - weil ein paar Flags anders waren, als sie eigentlich sein sollten. Und somit wurde nicht nur das Insert gebaut, sondern auch ein Update der AutoIncrement-Spalte.  Und an die Stelle hatte ich natürlich nicht geguckt, weil ich dachte, da geht er nicht rein.


MFG,
speedy


----------

