user
adalah kata khusus
. Ini adalah alias untuk current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Jika Anda ingin menggunakan user
sebagai nama tabel, karena ini adalah kata yang dicadangkan, Anda harus mengutip pengenalnya , misalnya:
SELECT id FROM "user";
ORM Anda harus mengutip semua pengidentifikasi, atau setidaknya kata-kata yang dicadangkan. Kegagalan untuk melakukannya adalah bug di ORM Anda. Anda dapat mengatasi bug ORM dengan menggunakan kata non-reserved sebagai nama tabel.
Saya pikir ini sedikit kutil di psql
yang secara otomatis mengutip pengidentifikasi yang Anda berikan ke perintah garis miring terbalik. Jadi \d user
akan berfungsi tetapi select * from user
tidak akan. Anda harus menulis \d "user"
. Masalah yang sama muncul dengan sensitivitas huruf besar-kecil di mana \d MyTable
berfungsi tetapi SELECT * FROM MyTable
tidak akan bekerja, Anda harus menulis SELECT * FROM "MyTable"
.
Akan lebih baik untuk memberikan HINT
pesan tentang ini dalam kesalahan. Sayangnya pengurai dan perencana tidak benar-benar memiliki informasi yang cukup pada saat kesalahan "kolom tidak ada" dibuat untuk mengetahui bahwa Anda awalnya menulis kata kunci, yang dilihatnya hanyalah pemindaian fungsi pada saat itu.