PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sqlalchemy und PostgreSql:Wie kann man in Zukunft den Primärschlüssel manuell ohne Konflikte setzen?

Mir ist keine sichere und effiziente Möglichkeit bekannt, das zu tun, was Sie wollen. Sie sollten wirklich wählen, ob Sie die Schlüssel selbst definieren oder generierte Schlüssel verwenden und bei der einen oder anderen Strategie bleiben möchten.

Wenn Sie nichts gegen schreckliche Parallelität haben, können Sie LOCK TABLE thetable , mach deine Arbeit, setval die Bezeichnersequenz der Tabelle zum nächsten freien Wert nach dem, was Sie eingefügt haben, und commit um die Sperre zu lösen. Dies führt jedoch immer noch zu Problemen mit Apps, die explizit nextval aufrufen (wie viele ORMs), anstatt die Datenbank den Wert definieren zu lassen, indem sie ihn aus dem ?INSERT weglässt Spaltenliste oder explizit als DEFAULT benennen .

Andernfalls könnten Sie Ihren Code (oder eine PL/PgSQL-Hilfsfunktion) die Einfügung in einer Wiederholungsschleife ausführen lassen, die den Schlüssel erhöht und es erneut versucht, wenn ein Integritätsfehler auftritt. Diese Strategie funktioniert nicht, wenn Sie mehr als nur eine Einfügung pro Transaktion durchführen müssen. Außerdem in SERIALIZABLE Isolationsmodus Ich glaube nicht, dass Sie dies mit PL/PgSQL tun können, Sie müssen eine clientseitige Wiederholungsschleife verwenden, um Serialisierungsfehler zu behandeln.

Es ist eine schreckliche Idee. Verwenden Sie entweder konsistent anwendungsdefinierte Schlüssel oder konsistent datenbankdefinierte Schlüssel. Mischen Sie die beiden nicht.