Gần đây tôi đã nâng cấp từ PostgreQuery 9.5 lên PostgreSQL 10. Một trong những tính năng tiện lợi trong PostgreQuery 10 là loại cột nhận dạng mới , thay thế cho loại giả nối tiếp của PostgreQuery. Tài liệu chính thức cho cột danh tính có thể được tìm thấy trên một CREATE TABLE
trang.
Tuy nhiên, khi chèn nhiều hàng vào một bảng có GENERATED BY DEFAULT AS IDENTITY
cột và sử dụng từ khóa DEFAULT
để lấy giá trị ID tiếp theo, giá trị mặc định sẽ trở lại là null
.
Ví dụ: giả sử tôi có một bảng
CREATE TABLE test (
id int GENERATED BY DEFAULT AS IDENTITY,
t text
);
CREATE TABLE
Chèn một hàng với DEFAULT
từ khóa dường như hoạt động tốt.
INSERT INTO test (id, t) VALUES (DEFAULT, 'a');
INSERT 0 1
Chèn nhiều hàng thì không.
INSERT INTO test (id, t) VALUES (DEFAULT, 'b'), (DEFAULT, 'c');
ERROR: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, b).
Chèn nhiều hàng bằng cách sử dụng mặc định ngầm cũng hoạt động.
INSERT INTO test (t) VALUES ('d'), ('e');
INSERT 0 2
Vấn đề được chỉ định ở trên dường như không xuất hiện khi sử dụng kiểu SERIAL
giả cột.
CREATE TABLE test2 (
id SERIAL,
t text
);
CREATE TABLE
INSERT INTO test2 (id, t) VALUES (DEFAULT, 'a'), (DEFAULT, 'b');
INSERT 0 2
Vì vậy, câu hỏi của tôi là: tôi có thiếu một cái gì đó? Là DEFAULT
từ khóa không mong đợi để làm việc với cột nhận dạng mới ? Hay đây là một lỗi?