Không có cách nào dễ dàng để json_populate_record
trả về điểm đánh dấu có nghĩa là "tạo giá trị này".
PostgreSQL không không cho phép bạn chèn NULL
để chỉ định giá trị sẽ được tạo. Nếu bạn yêu cầu NULL
Pg mong đợi có nghĩa làNULL
và không muốn đoán trước bạn. Ngoài ra, hoàn toàn OK để có một cột được tạo ra không có ràng buộc NOT NULL
, trong trường hợp đó hoàn toàn tốt đẹp để chèn NULL
vào nó.
Nếu bạn muốn có PostgreSQL sử dụng mặc định bảng cho một giá trị có hai cách để làm điều này:
- Bỏ qua đó hàng từ
INSERT
cột danh sách; hoặc
- Rõ ràng viết
DEFAULT
, mà chỉ có giá trị trong một biểu thức VALUES
Vì bạn không thể sử dụng VALUES(DEFAULT, ...)
đây, lựa chọn duy nhất của bạn là để bỏ qua các cột từ cột INSERT
-list:
regress=# create table test (id serial primary key, name varchar(50));
CREATE TABLE
regress=# insert into test(name) select name from json_populate_record(NULL::test, '{"name": "John"}');
INSERT 0 1
Có, điều này có nghĩa là bạn phải liệt kê các cột. Hai lần, trên thực tế, một lần trong danh sách SELECT
và một lần trong danh sách cột INSERT
.
Để tránh sự cần thiết rằng PostgreSQL này sẽ cần phải có một cách để xác định DEFAULT
như một giá trị cho một kỷ lục, vì vậy có thể trở lại json_populate_record
DEFAULT
thay vì NULL
cho các cột không được xác định. Đó có thể không phải là những gì bạn dự định cho tất cả các cột và sẽ dẫn đến câu hỏi về cách DEFAULT
sẽ được xử lý khi json_populate_record
là không đang được sử dụng trong biểu thức INSERT
.
Vì vậy, tôi đoán json_populate_record
có thể kém hữu ích hơn bạn mong đợi cho các hàng có khóa được tạo.
Nguồn
2013-07-28 13:34:31
"Tôi tìm thấy hàm' json_populate_record' ". Um. *Ở đâu*? Định nghĩa hàm là gì? Bạn đang chạy PostgreSQL 9.3 beta, hoặc nó là một chức năng bạn cài đặt từ một nơi khác? –
Chức năng 9.3 beta – user2627000