To, co opisujesz w swoim pytaniu, oczywiście nie jest tym, co się naprawdę dzieje. COPY
nie powiedzie się próba zaimportowania literałów ciągów ze zbędnymi pojedynczymi cudzysłowami do date
kolumna.
Aby pozbyć się zbędnych cytatów, zaimportuj do tabeli tymczasowej z text
kolumna, a następnie INSERT INTO
tabela docelowa przycinająca cudzysłowy:
CREATE TEMP TABLE wtmp (
city text
, temp_lo int
, temp_hi int
, prcp real
, date text -- note how I use text here.
);
COPY wtmp FROM '~aviad/postsgres/playground/weather.txt';
INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
SELECT city, temp_lo, temp_hi, prcp, trim(date, '''')::date
FROM wtmp
-- ORDER BY ?
;
Tabela tymczasowa jest automatycznie usuwana pod koniec sesji.
Słowa zastrzeżone jako identyfikatory
Widzę, że skopiowałeś przykład z instrukcji. Oto głęboki link do bieżącego podręcznika .
Prawdą jest, że ten przykład w instrukcji jest niefortunny. Radziłbym nie używać zastrzeżonych słów, takich jak date
jako nazwy kolumn. Jak widać tutaj
date
jest słowem zastrzeżonym w każdym standardzie SQL. Można go używać w Postgresie i widzę, jak kusi prosty przykład. Ale to nie czyni tego dobrym pomysłem. Ogólnie rzecz biorąc, powinieneś mieć zwyczaj unikania słowa zastrzeżone jako identyfikatory. Prowadzi to do mylących komunikatów o błędach i niepotrzebnie niezgodnego kodu SQL.