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

FEHLER:mehr als eine eigene Sequenz in Postgres gefunden

Aktualisierung: Dieser Fehler wurde in PostgreSQL v12 mit Commit behoben 19781729f78 .
Der Rest der Antwort ist für ältere Versionen relevant.

Eine serial Spalte hat eine Sequenz, die der Spalte gehört, und einen DEFAULT Wert, der den Nettosequenzwert erhält.

Wenn Sie versuchen, diese Spalte in eine Identitätsspalte zu ändern, erhalten Sie eine Fehlermeldung, dass es bereits einen Standardwert für die Spalte gibt.

Jetzt müssen Sie den Standardwert gelöscht haben, aber nicht die Sequenz, die zu serial gehört Säule. Als Sie dann die Spalte in eine Identitätsspalte konvertierten, wurde eine zweite Sequenz erstellt, die der Spalte gehört.

Wenn Sie nun versuchen, eine Zeile einzufügen, versucht PostgreSQL, the zu finden und zu verwenden Sequenz im Besitz der Spalte, aber es gibt zwei, daher die Fehlermeldung.

Ich würde argumentieren, dass dies ein Fehler in PostgreSQL ist:Meiner Meinung nach hätte es entweder die vorhandene Sequenz für die Identitätsspalte umfunktionieren oder Ihnen eine Fehlermeldung geben sollen, dass bereits eine Sequenz im Besitz der Spalte ist, und Sie sollten sie löschen. Ich werde versuchen, diesen Fehler zu beheben .

In der Zwischenzeit sollten Sie die zurückgelassene Sequenz manuell aus dem serial löschen Spalte.Führen Sie die folgende Abfrage aus:

SELECT d.objid::regclass
FROM pg_depend AS d
   JOIN pg_attribute AS a ON d.refobjid = a.attrelid AND
                             d.refobjsubid = a.attnum
WHERE d.classid = 'pg_class'::regclass
  AND d.refclassid = 'pg_class'::regclass
  AND d.deptype <> 'i'
  AND a.attname = 'patientid'
  AND d.refobjid = 'patient'::regclass;

Das sollte Ihnen den Namen der Sequenz geben, die von serial zurückgelassen wurde Säule. Lassen Sie es fallen, und die Identitätsspalte sollte sich wie gewünscht verhalten.