Postgres có giữ trật tự chèn hồ sơ không?


18

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

4
Câu trả lời thực tế sang một bên (mà tôi tin là không), bạn không nên dựa vào bất kỳ thứ tự nào khác ngoài câu hỏi bạn chỉ định trong các truy vấn của mình.
Dezső

Câu trả lời:


16

Câu trả lời cho trường hợp đơn giản này là . 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 đó.


Tôi nghĩ rằng Serge đã đề cập nhiều hơn đến câu hỏi liệu hàng đầu tiên sẽ luôn nhận được id = 1, id thứ hai = 2 và id thứ ba = 3 - không phải là "thứ tự" thực tế hay các hàng
a_horse_with_no_name

@a_horse_with_no_name: Để trả lời rằng : đó sẽ là trường hợp với một serialcột được tạo mới - lý tưởng trong cùng một giao dịch.
Erwin Brandstetter

Nếu câu hỏi là "ID của name3 sẽ luôn lớn hơn name1", thì nó có luôn luôn đúng không? (Liên quan đến đoạn 2 của bạn)
lulalala

@lulalala: Không nhất thiết cho các truy vấn phức tạp hơn với các phép nối và 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 đó.
Erwin Brandstetter

3

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.


3
Như @Erwin đã chỉ ra trong câu đầu tiên , anh ta chỉ nói "có" trong trường hợp cụ thể đó được đề cập trong câu hỏi. Như @deszo đã nói trong bình luận của mình , không bao giờ dựa vào thứ tự "chèn"; bạn phải luôn luôn chỉ định thứ tự trong câu lệnh select nếu bạn đang dựa vào thứ tự đó cho bất kỳ mục đích nào.
Max Vernon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.