Jeśli kolumna w tabeli Postgresa ma nazwę year
, jak powinno wyglądać INSERT
zapytanie, aby ustawić wartość dla tej kolumny?
Np .: INSERT INTO table (id, name, year) VALUES ( ... );
podaje błąd w pobliżu słowa roku .
źródło
Jeśli kolumna w tabeli Postgresa ma nazwę year
, jak powinno wyglądać INSERT
zapytanie, aby ustawić wartość dla tej kolumny?
Np .: INSERT INTO table (id, name, year) VALUES ( ... );
podaje błąd w pobliżu słowa roku .
Wystarczy ująć je year
w podwójne cudzysłowy, aby nie były interpretowane jako słowo kluczowe :
INSERT INTO table (id, name, "year") VALUES ( ... );
Z dokumentacji :
Istnieje drugi rodzaj identyfikatora: identyfikator rozdzielany lub identyfikator w cudzysłowie. Tworzy się przez ujęcie dowolnej sekwencji znaków w cudzysłów ("). Identyfikator rozdzielany jest zawsze identyfikatorem, a nie słowem kluczowym. Dlatego" select "może być użyte do odniesienia się do kolumny lub tabeli o nazwie" select ", podczas gdy niecytowany wybór byłby traktowany jako słowo kluczowe i dlatego powodowałby błąd analizy, gdy jest używany tam, gdzie oczekiwana jest nazwa tabeli lub kolumny.
MyTable
,myTable
Imytable
są tak samo. Z cudzysłowami to składanie nie jest wykonywane. Więc"MyTable"
nie jest już tym samym, comytable
.update "user" set "password" = 'value...';
działa doskonale ...Jeśli nie podajesz cudzysłowów w żadnych polach / kolumnach, zostaną one domyślnie zmniejszone przez Postgres. A Postgres pominie sprawdzanie słowa kluczowego, jeśli chodzi o nazwę kolumny.
W Twoim przypadku nie sądzę, aby dodawanie cytatów było obowiązkowe, jeśli chodzi o rozszerzenie
columns
. Ale jeśli używaszkeywords
(zarejestrowany przez PostgreSQL), jak nazwaTable
,Schema
,Function
lubTrigger
etc, należy użyć albo cudzysłowów, można też podać nazwę schematu z kropką konkatenacji.Załóżmy, że porządek jest słowem kluczowym zarejestrowanym przez Postgres. W niektórych scenariuszach musisz użyć tego słowa kluczowego jako nazwy tabeli.
W tym czasie Postgres pozwoli ci stworzyć tabelę z
keywords
. Na tym polega piękno Postgres.Aby uzyskać dostęp do tabeli zamówień, musisz użyć podwójnego cudzysłowu lub możesz podać nazwę schematu przed nazwą tabeli.
NA PRZYKŁAD
1.
select * from schema_name.order;
2.
select * from "order";
Podobnie możesz użyć tego typu kombinacji. Mam nadzieję, że to ci pomoże.
źródło
Aby być po bezpiecznej stronie, musisz zbudować instrukcję wstawiania z rozdzielanymi identyfikatorami.
SQL 2003 określa, że rozdzielany identyfikator powinien być umieszczany w cudzysłowie,
"
a jeśli w identyfikatorze występuje podwójny cudzysłów, należy go zduplikować. Zobacz BNF:https://ronsavage.github.io/SQL/sql-2003-2.bnf.html#delimited%20identifier
Oto kod do zacytowania identyfikatora:
A oto kod do zbudowania insertu:
static String build_insert (String table, String[] columns) { StringBuilder sql = new StringBuilder (); StringBuilder values = new StringBuilder (); sql.append ("INSERT INTO "); sql.append (delimited_identifier (table)); sql.append (" ("); int c = 0; if (columns.length > 0) { sql.append (delimited_identifier (columns[c])); values.append ("?"); } for (++c; c < columns.length; c++) { sql.append (", "); sql.append (delimited_identifier (columns[c])); values.append (", ?"); } sql.append (") VALUES ("); sql.append (values.toString ()); sql.append (")"); return sql.toString (); }
Przykład:
źródło