Làm cách nào tôi có thể biết khóa chính miễn phí tiếp theo của một số mô hình?Mô hình khóa chính tiếp theo có sẵn
Trả lời
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ị nó đượ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.
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 mà là 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.
Không, ID không phải là MAX (column_name) +1. –
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 đó. –
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?
this đoạn mã chắc chắn sẽ giúp bạn.
-Sử dụng Django và Mysql
next_id = Table.objects.filter (id__gt = current_id) [0] .id
- 1. Tạo tên duy nhất có sẵn tiếp theo trong C#
- 2. Máy chủ SQL: chèn tiếp theo có sẵn int
- 3. Mô hình ẩn Markov dự đoán quan sát tiếp theo
- 4. Rails - hai chiều mô hình "tình bạn" (tiếp theo)
- 5. NHÓM THEO TỪ khóa chính hoặc khóa chính?
- 6. Mua khóa ngay khi có sẵn
- 7. Có NUMA chính sách tiếp theo trong Linux hiện đại
- 8. Cách tạo mô hình không có khóa chính trong đường ray
- 9. Không có tùy chọn để ánh xạ tên cột trong mô hình tiếp theo
- 10. Mô hình người dùng django và trường khóa chính tùy chỉnh
- 11. Lấy chìa khóa tiếp theo trong một mảng
- 12. Công nghệ nào có sẵn cho mô hình xuất bản/đăng ký sử dụng .NET?
- 13. Có tốt không khi có khóa ngoại là khóa chính?
- 14. Mô hình có từ khóa được đặt trước
- 15. REST - chuyển tiếp trạng thái mô hình
- 16. Bàn không có khóa chính
- 17. Xóa mô hình xương sống theo id?
- 18. Selenium IDE: Làm thế nào để chọn ngày có sẵn tiếp theo từ datepicker
- 19. Django- Lấy mô hình khóa nước ngoài
- 20. Công việc Jenkins đang đợi người thi hành tiếp theo có sẵn
- 21. Sử dụng UUID làm khóa chính trong các mô hình Django (tác động quan hệ chung)
- 22. Lấy khóa có sẵn đầu tiên trong bản đồ
- 23. Làm thế nào để mô hình liên kết một-nhiều trong phần tiếp theo?
- 24. Drupal có tuân theo mô hình MVC không?
- 25. Hibernate không có khóa chính
- 26. Kết nối tải theo yêu cầu với Bộ nối tiếp mô hình hoạt động
- 27. Lấy tên trường chính của mô hình Django
- 28. Các khóa động JBuilder cho các thuộc tính mô hình
- 29. Cảnh báo: Không có mô hình lớp nào có sẵn để tạo mã trong Visual Paradigm
- 30. Rails 3. sắp xếp theo mô hình được liên kết
Ah, sự giàu có của kiến thức. –
Wow, cảm ơn lời giải thích chi tiết như vậy. – user20955