2009-02-24 28 views

Trả lời

17

Thậm chí nếu bạn có thể truy vấn giá trị khóa chính có sẵn tiếp theo, nó sẽ không giúp bạn. Trừ khi bạn khóa bảng, bạn không thể sử dụng giá trị đó trước khi một số khách hàng cơ sở dữ liệu khác có thể lấy nó cho chèn của họ.

Thay vào đó, bạn chỉ nên chèn hàng của mình và sau đó bạn có thể truy vấn giá trị khóa gần đây nhất được tạo trong phiên hiện tại của bạn. Mỗi cơ sở dữ liệu hỗ trợ khóa chính được tạo tự động cung cấp một phương thức để truy xuất khóa gần đây nhất được chèn vào trong phiên của bạn.

Phần "trong phiên của bạn" rất quan trọng vì nó bảo vệ phiên của bạn khỏi mọi lần chèn được thực hiện đồng thời bởi các ứng dụng khách khác. Chúng có thể tạo ra các giá trị quan trọng và phiên của bạn sẽ tiếp tục báo cáo cùng một giá trị được chèn gần đây nhất.

@Stuart Childs supposes rằng MySQL tạo ID tiếp theo với MAX(column_name)+1 nhưng điều này không chính xác. Giả sử bạn chèn một hàng và một giá trị ID được tạo. Nhưng bạn quay lại chèn này, hoặc sau đó DELETE hàng đó. Lần sau khi bạn chèn, MySQL sẽ tạo ra một giá trị ID mới. Vì vậy, giá trị ID lớn hơn giá trị ID cuối cùng được tạo ra bởi bất kỳ khách hàng nào, bất kể hàng nào hiện được lưu trữ trong bảng.

Tương tự như vậy nếu bạn chèn nhưng không cam kết ngay lập tức. Trước khi bạn cam kết, một số ứng dụng khách khác thực hiện chèn. Cả phiên của bạn và phiên của khách hàng khác sẽ có giá trị ID duy nhất của riêng họ được tạo. Các khóa chính được tạo tự động hoạt động mà không tính đến việc cô lập giao dịch, để đảm bảo tính duy nhất.

Giá trị khóa chính được tạo tự động không được sử dụng lại hoặc cấp phát cho nhiều phiên, ngay cả khi bạn chưa cam kết chèn hoặc nếu bạn khôi phục chèn hoặc nếu bạn xóa hàng.

+0

Ah, sự giàu có của kiến ​​thức. –

+0

Wow, cảm ơn lời giải thích chi tiết như vậy. – user20955

-1

Tôi nghĩ bạn sẽ phải thực hiện một số custom SQL. SQL bạn cần sẽ là DB cụ thể. Theo tôi biết, không có cách nào đáng tin cậy để làm điều này trong MySQL. Bạn có thể lấy ID chèn cuối cùng nhưng đó là phiên cụ thể (nghĩa là bạn có thể nhận được ID của hồ sơ cuối cùng mà bạn đã chèn trong phiên DB của mình nhưng không phải là ID cuối cùng cho một phiên khác có thể xảy ra sau phiên của bạn). Tuy nhiên (và ai đó sửa tôi nếu tôi sai), MySQL tạo ID tiếp theo bằng MAX (column_name) + 1 để bạn có thể thực hiện tương tự.

PostgreSQL giúp dễ dàng hơn nhiều với số sequence manipulation functions.

Edit:

Hóa ra tôi đã nghĩ đến việc AUTO_INCREMENT cột trong một multi-column key tạo ra với MAX (column_name) +1. Tuy nhiên, điểm vẫn đứng đó là không có cách nào để lấy ID tiếp theo trước khi nó được tạo bởi một chèn, đó là câu hỏi ban đầu.

+0

Không, ID không phải là MAX (column_name) +1. –

+0

Vâng, bạn nói đúng. Tôi nên đã kiểm tra vì nó sẽ được khá braindead cho bất kỳ DB đa người dùng để làm điều đó. –

0

Tôi đã có cùng một câu hỏi này vì tôi đã sao chép một phần tử và tôi muốn thay đổi phần tử thành phần mới để có thể chèn nó.

Giải pháp của tôi là như sau:

import copy 
objectCopy=copy.copy(object) 
objectCopy.pk=None 
objectCopy.save() 

Ý tôi là, nếu save() nào đó cho bạn, tại sao bạn sẽ muốn làm điều đó bằng tay?

-1

this đoạn mã chắc chắn sẽ giúp bạn.

2

-Sử dụng Django và Mysql

next_id = Table.objects.filter (id__gt = current_id) [0] .id

Các vấn đề liên quan