Câu trả lời:
Tôi không chắc đó có phải là cú pháp mong muốn của bạn hay không. Kiểm tra cú pháp của bạn choUPDATE
Hiện tại, đó là
[ 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 ] [, ...] ]
Vì vậy, nếu bạn cung cấp table t1
, nó sẽ được phân tích cú pháp dưới dạng bảng table
. Trên thực tế, để làm điều đó bạn cần phải có nó trong trích dẫn "table" t1
mà bạn đang làm hoặc thư viện của bạn đang làm.
Hãy tạo một số dữ liệu văn bản,
CREATE TABLE "table" AS
SELECT x AS column, x AS column2
FROM generate_series(1,12345) AS t(x);
Bây giờ chúng tôi có thể thử truy vấn ban đầu của bạn và nhận kết quả ban đầu của bạn,
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;
Và đó là vấn đề bạn đang gặp phải. Cũng như bảng, nếu bạn định sử dụng từ khóa SQL, bạn cần trích dẫn nó. Thật thú vị, điều đó không đủ ở đây.
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;
Ngoài ra, dường như việc khử răng cưa bảng không được hỗ trợ trong danh sách SET , bất kể cột có được từ khóa dành riêng hay không.
UPDATE "table" t1 SET "column"=0 WHERE t1.column2=1234;
Tại sao bạn không thể sử dụng bí danh, xocolatl từ IRC giúp với điều đó,
<xocolatl> EvanCarroll: lý do bạn không thể sử dụng bí danh ở bên trái của = là vì các loại hỗn hợp
<xocolatl> EvanCarroll: vì vậy, đây không phải là lỗi mà là WAD
Vì vậy, trong mã cho CREATE
một bảng với một kiểu hỗn hợp tùy chỉnh, thực hiện một UPDATE
trên nó.
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;
Vì vậy, cú pháp cho phép .
là mycol.type-address
, không tablealias.col-name
.
Nếu điều đó không có ý nghĩa, bất kỳ hành vi nào nhưng hành vi này sẽ cung cấp cho bạn một cú pháp mơ hồ,
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;
Điều gì mycol.x
đề cập đến ở đó? Vì nó không mơ hồ, tham chiếu bảng và khử răng cưa bảng bị vô hiệu hóa, do đó, nó chắc chắn 100% thời gian của một loại hỗn hợp có tên mycol
, trên bảng mytable
.
column_name = expression
. Đó là, bạn không có tên bảng cùng với tên cột. Vì vậy, điều này không có gì để làm với một cột được gọi "column"
hoặc một bảng được gọi "table"
. Bạn có thể sử dụng các từ không dành riêng và PostgreSQL vẫn sẽ khiếu nại. Hãy thử: 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;
và bạn sẽ nhận được ERROR: column "t" of relation "normal_table_name" does not exist
.
Đó là một sự kỳ lạ của Postgres. Như đã nêu trong tài liệu cho UPDATE
, tên bảng không nên được sử dụng cho các cột mục tiêu.
column_name
Tên của một cột trong bảng được đặt tên theo
table_name
. Tên cột có thể đủ điều kiện với một tên trường con hoặc chỉ mục mảng, nếu cần. Không bao gồm tên của bảng trong đặc tả của cột mục tiêu - ví dụ:UPDATE table_name SET table_name.col = 1
không hợp lệ.
Chỉ có một bảng có thể được cập nhật trong một UPDATE
mệnh đề, vì vậy không có chỗ cho việc giải thích sai về tuyên bố.
UPDATE .... ORDER BY some_column;
đó là cú pháp không chuẩn. (những người bạn sẽ không gặp khó khăn khi chuyển đổi sang Postgres, bạn sẽ chỉ cần xóa ĐẶT HÀNG B) NG). Nó cũng xử lý hàng CẬP NHẬT theo từng hàng (kiểm tra các ràng buộc UNIITE theo từng hàng) và không ở cuối các câu lệnh, như tất cả các DBMS khác làm.