Tom: MySQL: Autoimcrement ohne Key?

Beitrag lesen

Hello,

id | blog_id | entry_id | ....

1  |       1 |        1 | ....
2  |       1 |        2 | ....
3  |       2 |        1 | ....
4  |       1 |        3 | ....

Du müsstest eigentlich eine weitere Tabelle führen für die Blogs und die jeweils nächste Entry-ID

ID_TABLE

blog_id | next_entry_id | ....
 autoinc |               |
 ------------------------------
       1 |             4 | ....
       2 |             2 | ....

Und dann wirst Du nicht drum herumkommen, den betroffenen Datensatz in dieser Nachschlagetabelle für die beiden notwendigen Statements zu sperren

Für das Anlegen eines neuen Entrys benötigst Du die die nächste Entry-ID

lock     record in ID_TABLE für blog_id = $blog_id
   select   next_entry_id aus ID_TABLE für blog_id = $blog_id
   update   next_entry_id in ID_TABLE mit next_entry_id+1 für blog_id = $blog_id
   unlock   table ID_TABLE

oder eben für das Anlegen eines neuen Blogs die nächste Nummer besorgen

insert
   select next_entry_id ... for blog_id = last_insert_id()

Da ist mMn keine Sperre notwendig, da der Eintrag einen _neuen_ Datensatz erzeugt, der dann für die next_entry_id den Default 1 haben muss und die blog_id automatisch hochzählt.

In wieweit man bei MySQL inzwischen ein Update über mehrere Tabellen und ein Subselect auf einer dieser beiden kombinieren kann zu einem atomar abgehandelten Statement, weiß ich nicht.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de