Tach!
Auch MySQL hat eine Programmiersprache an Bord. In der Dokumentation unter Stored Procedure zu finden.
Hm... dann kann ich auch php nehmen.
Ja, aber dann musst du mehrere SQL-Statements formulieren, absenden, auf Fehler bei der Ausführung prüfen und das Ergebnis auswerten. Es ist übersichtlicher, das in einem System zu lösen, als ein System damit zu beauftragen, ein anderes zu bedienen.
Gibt es eine "narrensichere" Methode als kurz vor dem Eintrag in der Tabelle nachzuschauen, ob es den Eintrag in der pseudo-unique-Spalte schon gibt?
Besonders toll ist diese Lösung nicht, weil man damit ein TOCTTOU-Problem hat. Zwischen Abfrage und Eintragen können andere Prozesse dazwischenpfuschen.
Oder soll ich für diesen kurzen Moment die Tabelle sperren?
Transaktion fallen mir da auch noch ein. Aber hier kann ich dir nicht mit Erfahrung dienen, wie sich das verhält mit dem Verhindern paralleler Zugriffen. Da musst du mal das Handbuch befragen.
Was ist hier die sinnvollste Lösung?
Am besten ist immer noch ein Unique Index. Ich könnte mir noch als Lösung vorstellen, eine zweite Spalte für das neue System einzuführen. Ab jetzt bekommt das bisherige Feld NULL eingetragen und das neue Feld ein NULL für alle bisherigen Werte (machts von selbst, wenn du sie als NULL (also nicht NOT NULL) anlegst). Trotz Unique Index darf man ja beliebig viele NULL-Einträge haben. Beim Abfragen nimmst du COLAESCE(neu, alt) und bekommst immer den ersten Nicht-NULL-Wert, also entweder den einen oder den anderen Wert. - Die Sache hat nur einen Haken, sie kann nicht sicherstellen, dass es keine Dopplungen mit alten Werten gibt. Leider kannst du auch keinen auto_increment mit Startwert vergeben, weil das die NULL-Felder ausfüllen will.
dedlfix.