Ví dụ: khi tôi đang sử dụng truy vấn trả về id bản ghi
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Sản phẩm nào sản xuất:
1
2
3
Id này sẽ trỏ đến các giá trị được chèn tương ứng?
1 -> name1
2 -> name2
3 -> name3
Ví dụ: khi tôi đang sử dụng truy vấn trả về id bản ghi
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Sản phẩm nào sản xuất:
1
2
3
Id này sẽ trỏ đến các giá trị được chèn tương ứng?
1 -> name1
2 -> name2
3 -> name3
Câu trả lời:
Câu trả lời cho trường hợp đơn giản này là Có . Các hàng được chèn theo thứ tự được cung cấp trong VALUESbiểu thức. Và nếu idcột của bạn là một serialloại, các giá trị từ chuỗi bên dưới sẽ được tìm nạp theo thứ tự đó.
Nhưng đây là một chi tiết thực hiện và không có gì đảm bảo. Cụ thể, thứ tự không nhất thiết phải được duy trì trong các truy vấn phức tạp hơn với các WHEREđiều kiện hoặc tham gia.
Bạn cũng có thể nhận được các khoảng trống hoặc các hàng khác được trộn lẫn nếu bạn có các giao dịch đồng thời ghi vào cùng một bảng cùng một lúc. Không thể, nhưng có thể.
Không có thứ tự "tự nhiên" trong bảng cơ sở dữ liệu. Mặc dù thứ tự vật lý của các hàng (được phản ánh trong cột hệ thốngctid ) sẽ tương ứng với thứ tự được chèn ban đầu, có thể thay đổi bất cứ lúc nào. UPDATE, DELETE, VACUUMVà các lệnh khác có thể thay đổi thứ tự vật lý của hàng. Nhưng các giá trị được tạo ra idlà ổn định và tất nhiên không liên quan đến điều đó.
serialcột được tạo mới - lý tưởng trong cùng một giao dịch.
WHEREđiều kiện. Mặc dù tôi không thể nghĩ ra các WHEREđiều kiện đơn giản sẽ thay đổi thứ tự các hàng, nhưng các phép nối chắc chắn có thể làm điều đó.
Câu trả lời của Erwin Brandstetter có thể không đúng trong một trường hợp nhất định.
Chúng tôi đã thực hiện INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
và chúng tôi thấy rằng các
SELECT ctid,* FROM foo
chương trình cho thấy thứ tự vật lý của các hàng trong bảng không khớp chính xác với thứ tự chèn, có vẻ như nó bị xáo trộn một chút. Lưu ý rằng bảng của chúng tôi có một cột jsonb với kích thước dữ liệu rất thay đổi. Thực nghiệm cắt ngắn dữ liệu jsonb trong quá trình chèn khiến thứ tự chèn là chính xác.