Melarikan diri dari nama kolom seperti kata kunci di Postgres

134

Jika kolom pada tabel Postgres memiliki nama year, bagaimana seharusnya mencari INSERTquery untuk menetapkan nilai untuk kolom itu?

Misalnya: INSERT INTO table (id, name, year) VALUES ( ... );memberikan kesalahan di dekat kata tahun .

shybovycha
sumber

Jawaban:

211

Cukup lampirkan yeardalam tanda kutip ganda untuk menghentikannya ditafsirkan sebagai kata kunci :

INSERT INTO table (id, name, "year") VALUES ( ... );

Dari dokumentasi :

Ada jenis pengidentifikasi kedua: pengidentifikasi terbatas atau pengenal yang dikutip. Ini dibentuk dengan melampirkan urutan karakter acak dalam tanda kutip ganda ("). Identifier dibatasi selalu merupakan pengidentifikasi, tidak pernah kata kunci. Jadi" pilih "dapat digunakan untuk merujuk ke kolom atau tabel bernama" pilih ", sedangkan pilih yang tidak dikutip akan diambil sebagai kata kunci dan karenanya akan memicu kesalahan parse ketika digunakan di mana nama tabel atau kolom diharapkan.

NPE
sumber
44
Beberapa peringatan: Tanpa tanda kutip PostgreSQL melipat semua pengidentifikasi ke huruf kecil. MyTable, myTabledan mytablesama saja. Dengan kutipan lipat ini tidak dilakukan. Jadi "MyTable"tidak lebih sama dengan mytable.
AH
19
Lebih baik lagi, jangan menggunakan kata - kata yang dicadangkan atau case campuran sebagai pengidentifikasi dan Anda tidak akan pernah harus menggunakan tanda kutip ganda atau mendapatkan pesan kesalahan aneh.
Erwin Brandstetter
8
@ErwinBrandstetter Masalahnya adalah ketika Anda mengerjakan proyek yang sudah mapan.
ceruleus
5
@ HoàngLong ya itu. update "user" set "password" = 'value...';bekerja dengan sangat baik ...
Phill
0

Jika Anda tidak memberikan tanda kutip di Bidang / Kolom apa pun, secara default akan diturunkan oleh Postgres. Dan Postgres akan melewatkan memeriksa kata kunci ketika datang ke nama kolom.

Dalam kasus Anda, saya pikir itu tidak wajib untuk menambahkan kutipan ketika datang ke columns. Tapi jika Anda menggunakan keywords(didaftarkan oleh Postgres) sebagai nama Table, Schema, Functionatau Triggerdll, Anda harus harus menggunakan tanda kutip baik ganda, atau Anda dapat menentukan nama skema dengan dot Rangkaian.

Misalkan, pesanan adalah kata kunci yang didaftarkan oleh Postgres. Dan dalam beberapa skenario, Anda harus menggunakan kata kunci ini sebagai nama tabel.

Pada saat itu, Postgres akan memungkinkan Anda untuk membuat tabel keywords. Itulah keindahan Postgres.

Untuk mengakses tabel pesanan, Anda harus menggunakan penawaran ganda atau Anda dapat nama skema sebelum nama tabel.

MISALNYA

1.

select * from schema_name.order;

2.

select * from "order";

Demikian juga, Anda dapat menggunakan kombinasi jenis ini. Semoga ini bisa membantu Anda.

Mayur
sumber