Hallo zusammen,
ich habe mir eine kleine Testtabelle erstellt, anhand derer ich euch mein CSV-Import Problem zeigen möchte. Die Tabelle besteht aus 2 Spalten: zum Einen eine Autoinkrementspalte und zum Anderen eine Spalte vom Typ “publish year”, wobei es sich dabei um eine varchar(100)-Spalte mit entsprechendem Constraint handelt (Die Jahreszahl muss aus 4 Zahlen bestehen). Im Gegensatz zur “ID” Spalte, kann die “value”-Spalte NULL Werte enthalten.
- Zunächst also mal die Tabelle (kann man bei sich direkt “nachkochen”)
CREATE DOMAIN publish_year AS VARCHAR (100) CONSTRAINT publish_year_format CHECK
(VALUE SIMILAR TO '[0-9][0-9][0-9][0-9]');
COMMENT ON DOMAIN publish_year IS 'Year of publication...';
CREATE TABLE mytable
(
"ID" serial NOT NULL,
"value" publish_year,
CONSTRAINT pk_mytable PRIMARY KEY ("ID")
)
WITH (
OIDS=FALSE
);
ALTER TABLE mytable OWNER TO postgres;
- Es soll folgende CSV zum Test importiert werden:
"id","value"
1,"\N"
2, "2010"
- Abschließend soll der eigentliche CSV-Import via “Copy x FROM y” ausgeführt werden.
Dem Copy-Befehl gebe ich mit, dass …
a) … es sich um eine CSV-Datei handelt
b) … die Datei eine Headerzeile hat
c) … die Nullwerte als \N dargestellt werden
COPY mytable FROM '/tmp/testdata.csv' CSV HEADER NULL AS E'\N';
Problem:
Es kommt immer folgende Fehlermeldung. Wenn ich die Spalte “value” ganz normal ohne Constraint definiere, nämlich einfach nur als varchar(100), so geht der Importbefehl erfolgreich durch. Postgres erkennt offenbar an dieser Stelle nicht, dass mit “\N” ein Nullwert gemeint ist.
[WARNING ] COPY mytable FROM '/tmp/testdata.csv' CSV HEADER NULL AS E'\N'
ERROR: value for domain publish_year violates check constraint "publish_year_format"
CONTEXT: COPY mytable, line 2, column value: "\N"
Evtl. hat von euch ja jmd. eine Idee oder hat schonmal sowas ähnliches gehabt. Ich bin für jede Hilfe dankbar.
Wenn ich den Import via phpPGAdmin mache und eben dort den Import aufrufe, so klappt dieser auch.
phpPGAdmin scheint da also auch einen anderen “Copy from”-Befehl anzuwenden…ich weiß leider nicht, welcher das ist
Grüße
PS: Ich weiß, dass das Beispiel sehr konstruiert erscheint, aber das liegt daran, dass ich meine eigentliche Tabelle auf das Wesentliche reduziert habe um eben den entsprechenden Fall für euch reproduzieren zu können. Dass man für das Ablegen von Jahreszahlen einen Integer nehmen sollte, weiß ich natürlich …