PostgreSQL-Fremdschlüssel-Einschränkungsfehler: Ein einzigartiges Einschränkungsproblem
Dieser Artikel befasst sich mit einem häufigen Fremdschlüsseleinschränkungsfehler in PostgreSQL 9.1: „FEHLER: Es gibt keine eindeutige Einschränkung, die mit den angegebenen Schlüsseln für die referenzierte Tabelle „bar“ übereinstimmt.“ Wir analysieren die Ursache und bieten eine Lösung.
Das Szenario umfasst drei Tabellen: „foo“, „bar“ und „baz“. „foo“ hat einen Primärschlüssel („name“). „bar“ verweist über „foo_fk“ auf „foo“, hat einen eigenen Primärschlüssel („pkey“) und eine eindeutige Einschränkung für („foo_fk“, „name“). „baz“ verweist mit „bar_fk“ auf „bar“.
Die Fehlermeldung bedeutet, dass die Fremdschlüsseleinschränkung in „baz“ nicht erzwungen werden kann, da mehrere Zeilen in „bar“ möglicherweise dieselben Werte für „foo_fk“ und „name“ haben. Dies verletzt die referenzielle Integrität, da der Fremdschlüssel in „baz“ eine entsprechende Zeile in „bar“ nicht eindeutig identifizieren kann.
Das Problem ergibt sich aus der Eindeutigkeitsbeschränkung in „bar“. Obwohl es in der Kombination von „foo_fk“ und „name“ eindeutig ist, garantiert es nicht die Einzigartigkeit von „name“ innerhalb von „bar“ unabhängig voneinander. Daher könnten in „bar“ mehrere Zeilen mit demselben „Namen“, aber unterschiedlichen „foo_fk“-Werten vorhanden sein.
Die Lösung:
Um dieses Problem zu beheben, fügen Sie der Spalte „name“ in der Tabelle „bar“ eine eindeutige Einschränkung hinzu. Dadurch wird sichergestellt, dass jeder „Name“-Wert eindeutig ist, sodass die Fremdschlüsseleinschränkung in „baz“ ordnungsgemäß funktioniert. Nach der Implementierung dieser eindeutigen Einschränkung wird die Fremdschlüsselbeziehung ordnungsgemäß durchgesetzt, wodurch der Fehler verhindert und die beabsichtigte Datenbankstruktur hergestellt wird.
Das obige ist der detaillierte Inhalt vonWarum schlägt meine PostgreSQL-Fremdschlüsselreferenz mit „FEHLER: Es gibt keine eindeutige Einschränkung, die mit bestimmten Schlüsseln für die referenzierte Tabelle ‚bar' übereinstimmt' fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!