Đó là.
Bạn có thể cập nhật các cột của một hàng hoặc loại bản ghi trong plpgsql - giống như bạn có nó. Rõ ràng là nó sẽ hoạt động?
Tất nhiên, điều này sẽ cập nhật bảng bên dưới, không phải là biến!
UPDATE my_table SET date=now() WHERE id='1';
Bạn đang nhầm lẫn hai điều ở đây ...
Trả lời để làm rõ trong bình luận
Tôi không nghĩ rằng có cú pháp trong PostgreSQL có thể UPDATE
cả một hàng. Bạn có thể UPDATE
danh sách cột
, Tuy nhiên. Hãy xem xét bản trình diễn này:
Lưu ý cách tôi sử dụng thedate
thay vì date
dưới dạng tên cột, date
là một từ dành riêng
trong mọi tiêu chuẩn SQL và tên kiểu trong PostgreSQL.
CREATE TEMP TABLE my_table (id serial, thedate date);
INSERT INTO my_table(thedate) VALUES (now());
CREATE OR REPLACE FUNCTION test_up()
RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
_r my_table;
BEGIN
SELECT * INTO _r FROM my_table WHERE id = 1;
_r.thedate := now()::date + 5 ;
UPDATE my_table t
-- explicit list of columns to be to updated
SET (id, thedate) = (_r.id, _r.thedate)
WHERE t.id = 1;
END
$func$;
SELECT test_up();
SELECT * FROM my_table;
Tuy nhiên, bạn có thể INSERT
cả một hàng
một cách dễ dàng. Chỉ cần không cung cấp danh sách cột cho bảng (điều mà bạn thường nên làm, nhưng trong trường hợp này thì hoàn toàn ổn, không phải vậy).
Dưới dạng UPDATE
nội bộ là một DELETE
theo sau là INSERT
Dù sao, và một hàm tự động đóng gói mọi thứ trong một giao dịch, tôi không hiểu, tại sao bạn không thể sử dụng hàm này để thay thế:
CREATE OR REPLACE FUNCTION x.test_ delins()
RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
_r my_table;
BEGIN
SELECT * INTO _r
FROM my_table WHERE id = 1;
_r.thedate := now()::date + 10;
DELETE FROM my_table t WHERE t.id = 1;
INSERT INTO my_table SELECT _r.*;
END
$func$;