Sadece PostgreSQL tablo adı kullanılamaz (“ilişki mevcut değil”)


183

Basit bir veritabanı sorgusu yapmak için aşağıdaki PHP komut dosyasını çalıştırmaya çalışıyorum:

$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());

Bu, aşağıdaki hatayı üretir:

Sorgu başarısız oldu: HATA: "sf_bands" ilişkisi mevcut değil

Tüm örneklerde, birisinin ilişkinin mevcut olmadığını belirten bir hata aldığı yeri bulabilirim, çünkü tablo adlarında büyük harf kullanıyorlar. Tablo adımda büyük harf yok. Yani, veritabanı adı dahil olmadan benim tablo sorgulamak için bir yolu var mı showfinder.sf_bands?


2
Sf_bands tablosunun var olduğundan emin misiniz? Showfinder.sf_bands çalışıyor mu?
brian-brazil

1
showfinder.sf_bands mükemmel çalışıyor
Keyslinger

Belki de veritabanımın
MySQL'den taşındığına

Pg_query'yi ($ dbconn, $ query) deneyebilir misiniz? Örtülü bağlantı, hata ayıklaması zor sorunlara neden olabilir ve olası bir sorun olarak da ortadan kaldırabilir. Ayrıca showfinder'a bağlı olduğundan emin olmak için pg_dbname ($ dbconn) 'u deneyebilir misiniz?
brian-brazil

1
Sorunun büyük harflerinden bahsettiği için +1. PostgreSQL'de neden tek bir tablodan seçemediğimi anlamaya çalışırken bir saat geçirdim. Ne korkunç bir program.
Brain2000

Yanıtlar:


298

Okuduğum kadarıyla, bu hata tablo adına doğru referans vermediğiniz anlamına gelir. Sık karşılaşılan nedenlerden biri, tablonun karma harf yazımıyla tanımlanması ve tüm küçük harflerle sorgulamaya çalışmanızdır.

Başka bir deyişle, aşağıdakiler başarısız olur:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Tanımlayıcıları sınırlamak için çift tırnak işareti kullanın, böylece tablo tanımlandığı gibi belirli karışık harf yazımını kullanabilirsiniz.

SELECT * FROM "SF_Bands";

Yorumunuza göre, şemasını nitelendirmeden bir tablo adına başvurduğunuzda, sorgu her şema sırayla kontrol edilerek bu tablo adıyla eşleşecek şekilde "search_path" öğesine bir şema ekleyebilirsiniz. Tıpkı PATHkabukta veya include_pathPHP'de vb. Olduğu gibi Geçerli şema arama yolunuzu kontrol edebilirsiniz:

SHOW search_path
  "$user",public

Şema arama yolunuzu değiştirebilirsiniz:

SET search_path TO showfinder,public;

Ayrıca bkz. Http://www.postgresql.org/docs/8.3/static/ddl-schemas.html


Hata, affet beni. Tablo ismimin veritabanı ismimde değil büyük harfli olduğunu söylemek istedim.
09:39

13
SELECT * FROM SF_BandsPostgres bu tablo adını sizin için küçük harfe çevirmeye karar verdiğinden, bunu yazsanız bile yine de başarısız olacaktır. Tuhaf ...
Roman Starkov

3
@romkyns: Evet, bu aslında RDBMS markaları arasında oldukça yaygındır, bu tanımlanmamış tanımlayıcıların "büyük / küçük harfe duyarsız" olarak tanıtılmasıdır. Ama gerçekte büyük / küçük harfe duyarlı değiller çünkü uyguladıkları yol küçük harfleri zorlamak. Bu, tablonun adıyla, yalnızca tabloyu tanımladığınızda tablo adının küçük harfle yazılmasına izin vermiş olmanız durumunda eşleşir. TABLO OLUŞTURURKEN çift tırnaklı sınırlayıcılar kullanırsanız, sorgularda referans verirken sınırlayıcılar kullanmanız gerekir.
Bill Karwin

Postgres tırnak içinde yoksa tablo adlarını otomatik olarak küçük harfe çevirir mi? Bu oldukça asinine ...
Andy

@Andy, kendi SQL veritabanınızı yazarken, büyük / küçük harfe duyarsız tanımlayıcıları başka bir şekilde uygulamaktan çekinmeyin. :)
Bill Karwin

76

Bununla ilgili problemlerim vardı ve bu hikaye (üzgün ama gerçek):

  1. Tablo adınız küçük harfle yazılmışsa: kullanabileceğiniz hesaplar: select * from AcCounTsve sorunsuz çalışır

  2. Tablo adınız accounts aşağıdaki gibi küçük harfse: Aşağıdakiler başarısız olur: select * from "AcCounTs"

  3. Tablo adınız Accounts aşağıdaki gibi karışık bir durumdaysa: Aşağıdakiler başarısız olur: select * from accounts

  4. Tablo adınız Accounts aşağıdaki gibi karışık bir durumdaysa: Aşağıdakiler doğru çalışır: select * from "Accounts"

Böyle işe yaramaz şeyleri hatırlamaktan hoşlanmıyorum ama yapmanız gerekenler;)


1
Roland

8
5. gibi karışık durumda Accountsbaşarısız olacak, select * from Accounts;ben garip kısmı bulmak: aynı durumda aynı DEĞİL.
Roland

7
Tüm bunlar var: tırnak işaretleri kullanmadığınız sürece postgres sorgusundaki tüm isimler küçük harftir.
Erndob

1
Dördüncü seçenek benim için çalıştı, ama PHP kullanmıyorum
Sayari

2
Tüm etkileşimleri düzenlediğiniz için teşekkürler! :)
GetHacked

16

Postgres işlem sorgusu diğer RDMS'den farklı. Şema adını, "SCHEMA_NAME" gibi tablo adınızdan önce çift tırnak içine alın. "SF_Bands"


7
22 kez ve çok fazla ayrıntı ile onaylanmış, daha önce kabul edilen cevaba ne cevap veriyor?
Yaroslav

16

Dbname parametresini bağlantı dizenize yerleştirin. Her şey başarısızken benim için çalışıyor.

Ayrıca seçim yaparken your_schema. your_tablebunun gibi:

select * from my_schema.your_table

1
Şema adını, örneğin my_schema.my_relation ifadesini sorguya koymak yardımcı oldu.
JoeTidee

2
Çok teşekkür ederim! Reall sorunu çözmeme yardımcı oluyor! Ama şema adını atlayabileceğim bir yol var mı?
Charlotte

8

OSX'te de benzer bir sorun yaşadım, ancak çift ve tek tırnaklarla oynamaya çalıştım. Durumunuz için böyle bir şey deneyebilirsiniz

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

4

Bu gerçekten yararlı

SET search_path TO schema,public;

Ben bu sorunları daha fazla kazdı ve mevcut veritabanında yeni bir kullanıcı için defoult tarafından bu "arama_yolu" ayarlamak hakkında öğrendim.

DataBase Özellikleri'ni açın ve "Değişkenler" Sayfasını açın ve bu değişkeni gerçek değeri olan kullanıcı için ekleyin.

Böylece kullanıcı şimdi bu şema_adı defoult ile alacak ve tableName'i schemaName olmadan kullanabilirsiniz.


4

Şema adını ve tablo adını tırnak işaretine yazmalısınız. Aşağıda olduğu gibi:

select * from "schemaName"."tableName";

1

Benim için sorun, Django başlatılırken o tabloya bir sorgu kullanmıştı. Tabii ki bu bir hata atar, çünkü bu tablolar yoktu. Benim durumumda, bu, get_or_createherhangi bir işlem (bu durumda geçiş) çalıştırıldığında yürütülen bir admin.py dosyasındaki bir yöntemdi. Umarım birine yardım eder.


0

Önce şemayı eklemeniz gerekir, örn.

SELECT * FROM place.user_place;

Bunu tüm sorgulara eklemek istemiyorsanız şunu deneyin:

SET search_path TO place;

Şimdi işe yarayacak:

SELECT * FROM user_place;

0

En kolay çözüm Sadece tablo adını ve tüm sütun adlarını küçük harfle değiştirmek ve sorununuz çözülecektir.

Örneğin:

  • Değişim Table_Nameiçin table_name ve
  • Değişim ColumnNameiçincolumnname
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.