2011-12-25 46 views
7

Giả sử tôi đã có bảng:MySQL: có thể một AUTO_INCREMENT tạo ra các giá trị không theo thứ tự?

CREATE TABLE test (
    ID INT AUTO_INCREMENT PRIMARY KEY, 
    InsertTime DATETIME 
) ENGINE = InnoDB; 

Và, thông qua một trang web/PHP Apache, như một phản ứng với các yêu cầu web, tôi tiếp tục làm điều này:

INSERT INTO test (InsertTime) values (NOW()); 

Có an toàn để giả định nếu row1.ID > row2.ID thì row1.InsertTime >= row2.InsertTime? Hoặc có lẽ thông qua một số kết hợp không may của các yếu tố (máy chủ đa CPU trong một môi trường nhân rộng với các mặt trăng của sao Mộc trong sự liên kết chính xác vv) điều này có thể thất bại?

Lưu ý: Tôi không gặp bất kỳ sự cố nào. Tôi đang viết một phần mềm mới và tôi tự hỏi liệu tôi có thể dựa vào phân loại theo số ID để sắp xếp theo ngày (chỉ NOW() thậm chí sẽ được chèn vào cột đó).

+1

Điều này dường như không phải là vấn đề, mà là một cuộc thảo luận như vậy -> điều gì đó khác dành cho người lập trình SE? Và để ghi lại, tôi không thấy điều này có thể thất bại như thế nào. –

+2

@saratis - Không thấy đây là cuộc thảo luận như thế nào? Đó là một câu hỏi cụ thể. Hoặc là nó hoạt động 100% được bảo đảm hoặc không. –

+0

Mặc dù tôi đoán có 2 câu hỏi khác nhau ở đây. "Id có thể được tạo ra từ thứ tự chèn" và "thứ tự có bao giờ không khớp với thứ tự của cột ngày giờ không?" –

Trả lời

2

Tôi nghĩ rằng hầu hết các sự cố sẽ đến từ cuộc gọi tới NOW() thay vì AUTO_INCREMENT. Tôi nghi ngờ hầu hết các máy tính tại một số điểm in NOW() ngày ra khỏi trật tự! Điều này thường là do một sysadmin đã thay đổi đồng hồ, hoặc vì NTP đã thay đổi đồng hồ.

+0

Chà, tôi đã không nghĩ về NTP. Nó rất rõ ràng bây giờ! Và điều đó cũng có nghĩa là việc phân loại ID của tôi không chỉ có thể - nó được khuyến khích mạnh mẽ! Bởi vì đó là cách duy nhất để đảm bảo rằng các bản ghi được truy lục theo cùng thứ tự mà chúng đã được chèn vào. –

2

Tôi nghĩ rằng bạn sẽ có một số mâu thuẫn mỗi năm một lần vì DST (chắc chắn, nó phụ thuộc vào cài đặt máy chủ). Khác hơn là tôi không thấy lý do tại sao nó có thể thất bại.

+0

Trừ khi bạn đang thực hiện so sánh chuỗi thay vì so sánh ngày, DST sẽ không gây ra thay đổi thứ tự ngày tháng. Dấu thời gian được lưu dưới dạng UTC dưới mui xe. MySQL biết rằng 8 giờ tối trong UTC-7 nhỏ hơn 7:01 PM trong UTC-8. –

+0

Trong ví dụ trên, tôi sử dụng kiểu 'datetime' của MySQL không sử dụng UTC hoặc bất kỳ loại dấu thời gian nào. Thay vào đó nó lưu trữ ngày như một chuỗi (tốt, gần như). Đó là cách bạn có thể đạt được tất cả những ngày không hợp lệ như '00-00-0000'. Nó cũng không nói bất cứ điều gì về múi giờ, vì vậy tôi phải theo dõi bản thân mình. Tất cả trong tất cả, tôi đoán rằng TIMESTAMP sẽ là một lựa chọn tốt hơn nhiều. –

+0

Ồ, và điều đó cũng có nghĩa là do DST có thể có sự nhầm lẫn về thời gian trong quá trình chuyển đổi. Một lý do nữa để tránh kiểu dữ liệu đó. –

0

Có thể nếu ai đó đặt lại thủ công auto_increment trên bảng.

+0

Đó không phải là một phần của hoạt động bình thường. Bạn cũng có thể nhập ngày thủ công thay vì 'NOW()'. Rõ ràng, nếu bạn làm điều gì đó như thế, tất cả mọi phiên cược sẽ bị tắt. –

1

Tốt nhất khi tôi có thể biết, ID tự động sẽ không bao giờ không trả về các bản ghi theo thứ tự sai. Tuy nhiên, có một trường hợp khác bạn cần phải biết khi đặt hàng bằng ID.

Nếu khách hàng của bạn từng giữ hồ sơ để được chèn vào sau, khi đọc hồ sơ, họ sẽ không được đọc theo thứ tự được tạo. Ví dụ: tôi đã chạy vào điều này một số lần, khi xây dựng các ứng dụng khách cho các ứng dụng di động có quyền truy cập mạng không liên tục.

+0

Thú vị, mặc dù không thực sự là trường hợp của tôi. Xứng đáng với upvote anyway. :) –

0

Có, xóa cột auto_increment, sau đó tạo lại cột mới.

+1

Xem nhận xét của tôi về [câu trả lời của blockhead] (http://stackoverflow.com/a/8630149/41360). –

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