sql >> Databáze >  >> RDS >> Oracle

Oracle:rozdíl mezi max(id)+1 a sekvence.nextval

Pomocí select max(id) + 1 přístup, dvě relace vkládající současně uvidí stejné aktuální maximální ID z tabulky a obě vloží stejnou novou hodnotu ID. Jediný způsob, jak to bezpečně použít, je uzamknout tabulku před zahájením transakce, což je bolestivé a transakce serializuje. (A jak zdůrazňuje Stijn, hodnoty lze znovu použít, pokud je smazán nejvyšší záznam). V zásadě tento přístup nikdy nepoužívejte. (Velmi příležitostně k tomu může existovat pádný důvod, ale nejsem si jistý, zda jsem ho někdy viděl).

Sekvence zaručuje, že dvě relace získají různé hodnoty a není potřeba žádná serializace. Bude fungovat lépe a bude bezpečnější, bude se snáze kódovat a snáze se bude udržovat.

Jediným způsobem, jak můžete získat duplicitní chyby pomocí sekvence, je, že v tabulce již existují záznamy s ID nad hodnotou sekvence nebo pokud něco stále vkládá záznamy bez použití sekvence. Pokud jste tedy měli existující tabulku s ručně zadanými ID, řekněme 1 až 10, a vytvořili jste sekvenci s výchozí počáteční hodnotou 1, první vložení pomocí sekvence by se pokusilo vložit ID 1 – které již existuje . Po vyzkoušení 10krát by vám sekvence dala 11, což by fungovalo. Pokud byste pak použili přístup max-ID k provedení dalšího vložení, který by použil 12, ale sekvence by stále byla na 11 a také by vám dala 12, až příště zavoláte nextval .

Posloupnost a tabulka spolu nesouvisí. Sekvence se automaticky neaktualizuje, pokud je do tabulky vložena ručně vygenerovaná hodnota ID, takže se tyto dva přístupy nemíchají. (Stejnou sekvenci lze mimo jiné použít ke generování ID pro více tabulek, jak je uvedeno v dokumentech).

Pokud přecházíte z ručního přístupu na sekvenční přístup, musíte se ujistit, že sekvence je vytvořena s počáteční hodnotou, která je vyšší než všechna existující ID v tabulce, a že vše, co dělá vložení, používá sekvenci. pouze v budoucnu.



  1. Jak povolit pomalé dotazy MySQL Přihlaste se do MySQL

  2. 9 nejčastějších chyb návrhu databáze

  3. Jak zavřít připojení sqlalchemy v MySQL

  4. Závažná chyba:Nezachycená chyba:Volání nedefinované funkce mysql_connect()