Autor |
Beitrag |
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: Fr 25.02.22 11:14
hallo zusammen,
meine Vorlage für mein MsSQL Server...
www.w3schools.com/sql/sql_insert.asp
So wie im Beispiel zeigt klappt es. Ich will aber CustomerID selber vergeben.
Quelltext 1: 2:
| INSERT INTO Customers (CustomerID, CustomerName, ContactName, Address, City, PostalCode, Country) VALUES (12345, 'Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway'); |
Warum geht das nicht, wie sieht die Lösung aus?
Moderiert von Th69: Titel geändert (Rechtschreibung korrigiert).
Zuletzt bearbeitet von tomycat am Fr 25.02.22 11:17, insgesamt 1-mal bearbeitet
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 25.02.22 11:29
Warum das bei der Tabelle nicht geht, steht auch auf der Seite (gelber Kasten unter "INSERT INTO Example"):
Zitat: | Did you notice that we did not insert any number into the CustomerID field?
The CustomerID column is an auto-increment field and will be generated automatically when a new record is inserted into the table. |
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: Fr 25.02.22 15:38
das ist mir schon klar, aber wie kann ich selber die CustomerID vergeben?
Komisch ist nur, dass MSSQL mir Sprünge macht wie 89 -> 102 -> 333 ->> 340 ...
Eine Idee, wie das sein sein?
Lösung A oder B wäre super.
Die eine Webseite läuft unter Ubuntu/MySQL, da funkt es gut.
Die andere unter WindowsServer/MSSQL, mein Problem.
Idee?
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 25.02.22 15:51
Entweder Autoincrement ODER selbst vergeben. Mischen geht nicht. Wenn du die selbst vergeben willst mußt du die Autoincrement Eigenschaft von dem Feld wegnehmen.
Und wenn du es selbst machen willst kannst du dir dann überlegen einen "Generator"(vorhandenens Datenbankfeature) zu verwenden um eine eindeutige Nummer zu bekommen.
Autoincrement zählt immer hoch. Auch ein fehlerhafter Insert oder einer der nachher nicht commited wird ist trotzdem hochgezählt und weg.
Es geht nur um Eindeutigkeit bei ids. Die oft gehörte/gewünschte Forderung das sowas lückenlos oder fortlaufend sein sollte hört sich erstmal immer gut an ist aber ein Riesenproblem wenn man an sowas wie Skalierung etc. denkt. Und es hilft eigentlich bei nix. Die id von etwas sollte nur was absolut künstliches sein. Mit der einzigen Bedeutung von EINDEUTIG.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: Mo 14.03.22 18:50
danke für die Hilfe,
ich komme erst jetzt dazu an der Tabelle weiter zu arbeiten.
a) leider habe ich nichts gefunden um AUTO_INCREMENT abzuschalten.
b) woran kann das liegen, dass AUTO_INCREMENT grössere Sprünge macht, wo sollte man ansetzen?
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 14.03.22 20:38
a.) Reden wir hier von einer echten produktiven Datenbank mit vielen Daten drin wo man nicht einfach neu anfangen kann mit einem Primary Key ohne das Identity gesetzt ist?
Autoincrement scheint wirklich schwer wegzubekommen zu sein wenn man alles andere (insbesondere sein enthaltenen Daten) behalten will.
dbadailystuff.com/20...column-in-sql-server
b.) Jeder Insert wird gezählt. Irgendwo versuchst du also vermutlich inserts auf die Tabelle ohne diese Änderung auch zu commiten. Der Autoincrement Wert ist trotzdem weg. Solltest du halbwegs gutes Logging in der dazugehörenden Applikation implementiert haben(was du immer solltest) findet sich da dann bestimmt was.
Andere Möglichkeiten wären du löscht viel und daher große Lücken oder du hast am Primary Key eine größere Schrittweite als 1 angeben.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: Di 15.03.22 19:52
Idee?
- Backup der Tabelle
- ProduktID (autoincrement) -> ProduktID_Auto
- ProduktID wird neu erstellt.
geht mein Plan auf?
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 16.03.22 10:31
Möglich. Sobald da auch Constraints auf der Spalte sind wird es halt komplizierter. Du kannst nicht einfach die Spalten umbenennen und Daten hin und herkopieren wenn die Spalte irgendwo anders benutzt wird. Und bei einem Primary Key ist es sehr wahrscheinlich das der in irgendeiner anderen Tabelle als Foreign Key auftaucht.
Ironischerweise ist es hier einfacher wenn dein Datenbank Design "falsch" ist und du die refrenzielle Integrität weggelassen hattest. Dann kannst du einfach umbenennen. Ansonsten mußt du in der richtigen Reihenfolge auch die Constraints umziehen.
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 16.03.22 11:04
Kannst du nicht einfach einen kompletten Export der Datenbank machen (als SQL-Script)?
Dann bei CREATE TABLE das "autoincrement" löschen und daraus dann wieder eine neue DB aufsetzen.
Trotzdem sehe ich noch keinen Grund dafür, das "autoincrement" zu löschen, denn so benötigst du ja jedesmal beim Hinzufügen eigene Logik, um die "unique ID" zu setzen.
|
|