sql >> Databáze >  >> RDS >> Mysql

MySQL AUTO_INCREMENT se nevrací

Takhle to nemůže fungovat. Zvažte:

  • naprogramujte první, otevřete transakci a vložíte do tabulky FOO, která má autoinc primární klíč (libovolně říkáme, že dostane 557 pro svou hodnotu klíče).
  • Spustí se program dva, otevře transakci a vloží do tabulky FOO získání 558.
  • Naprogramujte dvě vložení do tabulky BAR, která má sloupec, který je cizím klíčem pro FOO. Takže nyní se 558 nachází ve FOO i BARu.
  • Program dva se nyní potvrzuje.
  • Spustí se program tři a vygeneruje zprávu z tabulky FOO. Záznam 558 se vytiskne.
  • Poté se program jeden vrátí zpět.

Jak databáze získá zpět hodnotu 557? Přejde do FOO a sníží všechny ostatní primární klíče větší než 557? Jak to opraví BAR? Jak to vymaže 558 vytištěné na výstupu programu sestav tři?

Sekvenční čísla Oracle jsou také nezávislá na transakcích ze stejného důvodu.

Pokud dokážete vyřešit tento problém v konstantním čase, jsem si jistý, že můžete vydělat spoustu peněz na poli databáze.

Nyní, pokud máte požadavek, aby vaše pole automatického přírůstku nikdy nemělo mezery (řekněme pro účely auditu). Pak nemůžete vrátit zpět své transakce. Místo toho musíte mít ve svých záznamech příznak stavu. Při prvním vložení je stav záznamu „Nedokončeno“, poté zahájíte transakci, uděláte svou práci a aktualizujete stav na „soutěž“ (nebo cokoli, co potřebujete). Když se pak zavážete, záznam je živý. Pokud se transakce vrátí zpět, neúplný záznam je stále k dispozici pro audit. To vám způsobí mnoho dalších bolestí hlavy, ale je to jeden způsob, jak se vypořádat s auditními záznamy.



  1. room error:Sloupce vrácené dotazem nemají pole název_pole

  2. Jaký je ekvivalent dotazu MySQL k PHP strip_tags?

  3. java.sql.SQLException:Nesprávná hodnota řetězce:'\xF0\x9F\x91\xBD\xF0\x9F...'

  4. Proč tento kód SQL zobrazuje chybu 1066 (Není jedinečná tabulka/alias:'uživatel')?