PostgreSQL-Tabellenname kann nicht einfach verwendet werden (“Beziehung existiert nicht”)

Lesezeit: 5 Minuten

PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
Schlüsselhalter

Ich versuche, das folgende PHP-Skript auszuführen, um eine einfache Datenbankabfrage durchzuführen:

$db_host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password")
    or die('Could not connect: ' . pg_last_error());

$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

Dies erzeugt den folgenden Fehler:

Abfrage fehlgeschlagen: FEHLER: Relation “sf_bands” existiert nicht

In allen Beispielen, die ich finden kann, bekommt jemand einen Fehler, der besagt, dass die Beziehung nicht existiert, weil sie Großbuchstaben in ihrem Tabellennamen verwenden. Mein Tabellenname enthält keine Großbuchstaben. Gibt es eine Möglichkeit, meine Tabelle abzufragen, ohne den Datenbanknamen einzuschließen, dh showfinder.sf_bands?

  • Sind Sie sicher, dass die Tabelle sf_bands existiert? Funktioniert showfinder.sf_bands?

    – Brian-Brasilien

    29. März 2009 um 20:26 Uhr

  • showfinder.sf_bands funktioniert einwandfrei

    – Schlüsselüberträger

    29. März 2009 um 20:37 Uhr

  • Vielleicht sollte ich anmerken, dass meine Datenbank von MySQL migriert wurde

    – Schlüsselüberträger

    29. März 2009 um 20:38 Uhr

  • Können Sie pg_query($dbconn, $query) ausprobieren? Die implizite Verbindung kann schwer zu debuggende Probleme verursachen und sie ebenso gut beseitigen wie ein mögliches Problem. Können Sie auch pg_dbname($dbconn) ausprobieren, um sicherzustellen, dass es tatsächlich mit Showfinder verbunden ist?

    – Brian-Brasilien

    29. März 2009 um 20:53 Uhr

  • +1 für die Erwähnung, dass die Großbuchstaben das Problem sind. Ich verbrachte eine Stunde damit, herauszufinden, warum ich in PostgreSQL nicht aus einer einzelnen Tabelle auswählen konnte. Was für ein schreckliches Programm.

    – Brain2000

    13. Oktober 2015 um 3:29 Uhr

PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
Bill Karwin

Nach dem, was ich gelesen habe, bedeutet dieser Fehler, dass Sie nicht korrekt auf den Tabellennamen verweisen. Ein häufiger Grund ist, dass die Tabelle mit gemischter Schreibweise definiert ist und Sie versuchen, sie nur in Kleinbuchstaben abzufragen.

Mit anderen Worten, Folgendes schlägt fehl:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Verwenden Sie doppelte Anführungszeichen, um Bezeichner abzugrenzen, damit Sie bei der Definition der Tabelle die spezifische Groß-/Kleinschreibung verwenden können.

SELECT * FROM "SF_Bands";

In Bezug auf Ihren Kommentar können Sie dem “Suchpfad” ein Schema hinzufügen, sodass die Abfrage, wenn Sie auf einen Tabellennamen verweisen, ohne sein Schema zu qualifizieren, mit diesem Tabellennamen übereinstimmt, indem jedes Schema der Reihe nach überprüft wird. So wie PATH in der Schale bzw include_path in PHP usw. Sie können Ihren aktuellen Schema-Suchpfad überprüfen:

SHOW search_path
  "$user",public

Sie können Ihren Schema-Suchpfad ändern:

SET search_path TO showfinder,public;

Siehe auch http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

  • Es scheint, dass auch wenn Sie tippen SELECT * FROM SF_Bands Dies wird immer noch fehlschlagen, da Postgres entscheidet, diesen Tabellennamen für Sie in Kleinbuchstaben zu schreiben. Seltsam…

    – Roman Starkow

    17. Mai 2011 um 15:09 Uhr

  • @romkyns: Ja, das ist bei RDBMS-Marken eigentlich ziemlich üblich, dass unbegrenzte Identifikatoren als „Groß- und Kleinschreibung“ beworben werden. Aber sie sind nicht wirklich case-insensitive, weil die Art und Weise, wie sie das implementiert haben, darin besteht, Kleinbuchstaben zu erzwingen. Dies stimmt nur dann mit dem Namen der Tabelle überein, wenn Sie bei der Definition der Tabelle die Kleinschreibung des Tabellennamens zugelassen hatten. Wenn Sie bei CREATE TABLE Trennzeichen in doppelten Anführungszeichen verwenden, müssen Sie Trennzeichen verwenden, wenn Sie in Abfragen darauf verweisen.

    – Bill Karwin

    17. Mai 2011 um 15:55 Uhr

  • Postgres schreibt Tabellennamen automatisch klein, wenn sie nicht in Anführungszeichen stehen? Das ist ziemlich blöd…

    – Andy

    4. Januar 2018 um 21:30 Uhr

  • @Andy, wenn Sie Ihre eigene SQL-Datenbank schreiben, können Sie Bezeichner ohne Berücksichtigung der Groß-/Kleinschreibung auf andere Weise implementieren. 🙂

    – Bill Karwin

    4. Januar 2018 um 21:39 Uhr

  • @BillKarwin Wirklich, Postgres sollte mutig genug sein, eine vernünftigere, modernere Fallbehandlung als Breaking Change herauszubringen.

    – Andy

    5. Januar 2018 um 6:30 Uhr


1646882648 103 PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
Mitzi

Ich hatte Probleme damit und das ist die Geschichte (traurig aber wahr):

  1. Wenn Ihr Tabellenname nur aus Kleinbuchstaben besteht, wie z. B. : accounts, können Sie Folgendes verwenden: select * from AcCounTs und es wird gut funktionieren

  2. Wenn Ihr Tabellenname aus Kleinbuchstaben besteht wie: accounts
    Folgendes wird fehlschlagen:
    select * from "AcCounTs"

  3. Wenn Ihr Tabellenname gemischte Groß- und Kleinschreibung ist wie: Accounts
    Folgendes wird fehlschlagen:
    select * from accounts

  4. Wenn Ihr Tabellenname gemischte Groß- und Kleinschreibung ist wie: Accounts
    Folgendes wird gut funktionieren:
    select * from "Accounts"

Ich erinnere mich nicht gerne an nutzloses Zeug wie dieses, aber man muss es tun 😉

  • Gleiches gilt für Spaltennamen in Where-Klauseln

    – Roland

    12. Mai 2014 um 15:46 Uhr

  • 5. Gemischter Fall, wie Accountswird mit scheitern select * from Accounts; Ich finde den seltsamsten Teil: Gleicher Fall ist NICHT identisch.

    – Roland

    12. Mai 2014 um 16:00 Uhr


  • Alles, was dazu gehört: Alle Namen in der Postgres-Abfrage sind Kleinbuchstaben, es sei denn, Sie verwenden Anführungszeichen.

    – Ernstob

    3. Oktober 2017 um 15:20 Uhr

  • Die vierte Option hat bei mir funktioniert, obwohl ich kein PHP verwende

    – Multi

    1. März 2018 um 20:20 Uhr

  • Vielen Dank für die Darstellung aller Interaktionen! 🙂

    – GetHacked

    26. August 2019 um 16:07 Uhr

1646882649 386 PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
Ugur Artun

Die Postgres-Prozessabfrage unterscheidet sich von anderen RDMS. Setzen Sie den Schemanamen in doppelte Anführungszeichen vor Ihren Tabellennamen wie folgt: “SCHEMA_NAME”.”SF_Bands”

  • Was fügt Ihre Antwort der zuvor akzeptierten Antwort hinzu, die 22 Mal positiv bewertet wurde und viele Details enthält?

    – Jaroslaw

    10. Oktober 2012 um 18:47 Uhr

1646882649 507 PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
JarosPL

Fügen Sie den dbname-Parameter in Ihre Verbindungszeichenfolge ein. Es funktioniert für mich, während alles andere fehlschlug.

Geben Sie bei der Auswahl auch die an your_schema.your_table so was:

select * from my_schema.your_table

1646882649 723 PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
sparen

Ich hatte ein ähnliches Problem unter OSX, habe aber versucht, mit doppelten und einfachen Anführungszeichen herumzuspielen. Für Ihren Fall könnten Sie so etwas versuchen

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"

1646882650 581 PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
kira

Sie müssen den Schemanamen und den Tabellennamen in Anführungszeichen schreiben. Wie nachstehend:

select * from "schemaName"."tableName";

1646882650 154 PostgreSQL Tabellenname kann nicht einfach verwendet werden Beziehung existiert nicht
Steve Shipway

Wenn ein Tabellenname Unterstriche oder Großbuchstaben enthält, müssen Sie ihn in doppelte Anführungszeichen setzen.

SELECT * from "Table_Name";

985900cookie-checkPostgreSQL-Tabellenname kann nicht einfach verwendet werden (“Beziehung existiert nicht”)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy