Antworten:
Ich bin mir nicht sicher, ob das Ihre gewünschte Syntax ist oder nicht. Überprüfen Sie Ihre Syntax fürUPDATE
Derzeit ist das
[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ FROM from_list ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
Wenn Sie also angeben table t1, wird es als Tabelle mit dem Namen analysiert table. Um dies zu tun, müssen Sie es in Anführungszeichen setzen, "table" t1die Sie tun, oder Ihre Bibliothek tut es.
Lassen Sie uns einige Textdaten erstellen,
CREATE TABLE "table" AS
SELECT x AS column, x AS column2
FROM generate_series(1,12345) AS t(x);
Jetzt können wir Ihre ursprüngliche Abfrage testen und Ihr ursprüngliches Ergebnis erhalten.
UPDATE "table" t1 SET t1.column=0 WHERE t1.column2=1234;
ERROR: column "t1" of relation "table" does not exist
LINE 1: UPDATE "table" t1 SET t1.column=0 WHERE t1.column2=1234;
Und das ist das Problem, das Sie bekommen. Wie bei der Tabelle müssen Sie ein SQL-Schlüsselwort in Anführungszeichen setzen, wenn Sie es verwenden möchten. Interessanterweise reicht das hier nicht aus.
UPDATE "table" t1 SET t1."column"=0 WHERE t1.column2=1234;
ERROR: column "t1" of relation "table" does not exist
LINE 1: UPDATE "table" t1 SET t1."column"=0 WHERE t1.column2=1234;
Darüber hinaus scheint das Tabellen-Aliasing in der SET-Liste nicht unterstützt zu werden , unabhängig davon, ob die Spalte ein reserviertes Schlüsselwort ist oder nicht.
UPDATE "table" t1 SET "column"=0 WHERE t1.column2=1234;
Warum Sie keine Aliase verwenden können, hilft xocolatl von IRC dabei,
<xocolatl> EvanCarroll: Der Grund, warum Sie den Alias links vom = nicht verwenden können, liegt in zusammengesetzten Typen
<xocolatl> EvanCarroll: Es ist also kein Fehler, sondern WAD
Also im Code zu CREATEeiner Tabelle mit einem benutzerdefinierten zusammengesetzten Typ und führen Sie eine UPDATEdarauf aus.
CREATE TYPE foo AS ( x int, y int );
CREATE TABLE foobar AS
SELECT v::foo AS mycol
FROM ( VALUES (1,2), (2,100) ) AS v;
UPDATE foobar SET mycol.x = 9;
Die Syntax, die das erlaubt, .ist also mycol.type-addressnicht tablealias.col-name.
Wenn das keinen Sinn ergibt, würde jedes Verhalten außer diesem Verhalten zu einer mehrdeutigen Syntax führen.
CREATE TYPE foo AS ( mycol int, x int );
CREATE TABLE mytable AS
SELECT v::foo AS mycol, 1 AS x
FROM ( VALUES (1,2), (2,100) ) AS v;
UPDATE mytable AS mycol SET mycol.x = 9;
Worauf bezieht mycol.xsich dort? Da es nicht mehrdeutig ist, ist die Tabellenreferenzierung und das Tabellenaliasing deaktiviert, sodass es definitiv 100% der Zeit ist, in der ein zusammengesetzter Typ mycolin der Tabelle genannt wird mytable.
column_name = expression. Das heißt, Sie haben keinen Tabellennamen zusammen mit dem Spaltennamen. Dies hat also nichts mit einer aufgerufenen Spalte "column"oder einer aufgerufenen Tabelle zu tun "table". Sie können nicht reservierte Wörter verwenden, und PostgreSQL wird sich weiterhin beschweren. Versuchen Sie: CREATE TABLE normal_table_name AS SELECT x AS c1, x AS c2 FROM generate_series(1, 1000) AS s(x); UPDATE normal_table_name t SET t.c1 = 2 WHERE t.c2 = 123;und Sie werden bekommen ERROR: column "t" of relation "normal_table_name" does not exist.
Es ist eine Postgres-Verrücktheit. Wie in der Dokumentation zu angegeben UPDATE, sollten Tabellennamen nicht für Zielspalten verwendet werden.
column_nameDer Name einer Spalte in der Tabelle mit dem Namen
table_name. Der Spaltenname kann bei Bedarf mit einem Unterfeldnamen oder einem Array-Index qualifiziert werden. Nehmen Sie den Namen der Tabelle nicht in die Angabe einer Zielspalte auf - dies ist beispielsweiseUPDATE table_name SET table_name.col = 1ungültig.
In einer UPDATEKlausel kann nur eine Tabelle aktualisiert werden , sodass keine Fehlinterpretation der Anweisung möglich ist.
UPDATE .... ORDER BY some_column;nicht standardmäßige Syntax. (Diejenigen, bei denen Sie keine Probleme mit der Konvertierung in Postgres haben, müssen nur ORDER BY entfernen). Wie alle anderen DBMS verarbeitet es auch die UPDATE-Anweisung zeilenweise (zeilenweise Überprüfung der UNIQUE-Einschränkungen) und no am Ende der Anweisungen.