Hallo,
ich hab folgendes Problem:
Ich hab ne Site in der werden für einen Client bei einem Besuch Einträge in der Datenbank gemacht.
Die Tabelle enthält eine Spalte "ID"... Sobald der Benutzer die Site besucht mach ich ein SELECT MAX(ID)+10 FROM ... und weise danach dem Eintrag der geschrieben wird die ID, die ich aus der Aggregat-Funktion bekommen hab, zu.
Leider ist es jetzt aber (so unwarscheinlich das auch klingen mag) schon ein paar mal vorgekommen das anscheinen wirklich gleichzeitig 2 Benutzer auf die Site gekommen sind und die Laufzeit zwischen der Aggregat-Funktion und dem Insert-Statement so lang (millisekunden) war das beide Benutzer die gleiche ID bekommen haben...
Gibt es einen Weg sowas zu umgehen?
Thx 4 Help
Problem mit Laufzeiten von Aggregat zu Insert > doppelte
-
jürgen2372
- Posts: 17
- Joined: 2004-08-31 23:00
Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte
Haste das Insert und das angegebene Select als ein Query?
INSERT INTO xxxxx SELECT MAX(ID)+10 FROM ....
INSERT INTO xxxxx SELECT MAX(ID)+10 FROM ....
Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte
Ne hab ich nicht als ein Query...
Ist das die einzigste Lösung um doppelte ID´s zu vermeiden?
von der Struktur her sieht das so aus
SELECT MAX(ID)+1...
bischen script in php
INSERT
Ist das die einzigste Lösung um doppelte ID´s zu vermeiden?
von der Struktur her sieht das so aus
SELECT MAX(ID)+1...
bischen script in php
INSERT
-
djholliday
- Posts: 26
- Joined: 2004-11-23 16:18
- Location: Nürnberg
Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte
Aber genau da liegt die Lücke.
In der Zeit, in der dein "bischen script in PHP" abgearbeitet wird, liefert jedes Select-Statement die gleiche Zahl.
Fass doch mal INSERT und SELECT zusammen, dann sollte es auch funktionieren.
Gruss,
Andreas
In der Zeit, in der dein "bischen script in PHP" abgearbeitet wird, liefert jedes Select-Statement die gleiche Zahl.
Fass doch mal INSERT und SELECT zusammen, dann sollte es auch funktionieren.
Gruss,
Andreas
-
djholliday
- Posts: 26
- Joined: 2004-11-23 16:18
- Location: Nürnberg
Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte
Falls deine ID vom Typ auto_increment ist könntest du auch mit LAST_INSERT() arbeiten
INSERT INTO xxxxx(ID, col2, col3) VALUES( LAST_INSERT_ID() + 1, 'Hello', 'World');
http://dev.mysql.com/doc/mysql/de/index.html
Gruss,
Andreas
INSERT INTO xxxxx(ID, col2, col3) VALUES( LAST_INSERT_ID() + 1, 'Hello', 'World');
http://dev.mysql.com/doc/mysql/de/index.html
Gruss,
Andreas
Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte
ich bin mir sicher das das alles lösungen sind mit denen man das problem umgehen könnte... allerdings verwende ich für die erstellung der einträge in der datenbank einen eigenen SQL-Wrapper... indem lässt sich das nicht so einfach implementieren ohen die komplette anwendung an vielen stellen neu zu schreiben...
allerdings habe ich einen weg gefunden das problem zu umgehen indem man einfach eine eigene tabelle erstellt indem die aktuellen höchsten id´s gepsichert werden und bei einer agregat-funktion in einer while-schleife solange hochzählt bis die id gültig ist... php see mysql_affected_rows...
sollte das prinzip auch nicht funzen werde ich den thrad noch mal weiterführen...
aber jetzt erst mal entwickeln und testen...
danke für die beiträge
allerdings habe ich einen weg gefunden das problem zu umgehen indem man einfach eine eigene tabelle erstellt indem die aktuellen höchsten id´s gepsichert werden und bei einer agregat-funktion in einer while-schleife solange hochzählt bis die id gültig ist... php see mysql_affected_rows...
sollte das prinzip auch nicht funzen werde ich den thrad noch mal weiterführen...
aber jetzt erst mal entwickeln und testen...
danke für die beiträge