sql >> Databáze >  >> RDS >> PostgreSQL

Sqlalchemy a PostgreSql:jak nastavit primární klíč ručně bez konfliktů v budoucnu?

Nevím o žádném bezpečném a efektivním způsobu, jak dělat to, co chcete. Měli byste si opravdu vybrat, zda chcete klíče definovat sami, nebo použít vygenerované klíče a držet se jedné nebo druhé strategie.

Pokud vám nevadí strašná souběžnost, můžete LOCK TABLE thetable , dělej svou práci, setval sekvence identifikátorů tabulky na další volnou hodnotu po tom, co jste vložili, a commit k uvolnění zámku. To však bude stále způsobovat problémy s aplikacemi, které explicitně volají nextval (jako mnoho ORM), spíše než nechat databázi definovat hodnotu jejím vynecháním z ?INSERT seznam sloupců nebo jej explicitně pojmenujte jako DEFAULT .

Jinak byste mohli nechat svůj kód (nebo pomocnou funkci PL/PgSQL) vložit do opakovací smyčky, která inkrementuje klíč a zkusí to znovu, když dojde k chybě integrity. Tato strategie nebude fungovat, pokud potřebujete udělat více než jen jedno vložení na transakci. Dále v SERIALIZABLE režim izolace Nemyslím si, že to můžete udělat s PL/PgSQL, musíte použít opakovací smyčku na straně klienta, abyste zvládli selhání serializace.

Je to hrozná představa. Buď používejte konzistentně klíče definované aplikací, nebo konzistentně klíče definované databází. Nesměšujte obojí.




  1. JOIN data ze stejné tabulky

  2. SQL automaticky vygeneruje chybějící data a cenu z bezprostředně předchozího data pro chybějící datum v tabulce

  3. MySQL str_to_date vytváří NULL navzdory platnému formátování

  4. Skript Google Apps pro export tabulek do mySQL se spouští na více souborech