2011-08-01 33 views
8

Tôi nghĩ câu trả lời cho câu hỏi của tôi là hiển nhiên nhưng vì tôi không thể tìm thấy bất kỳ tài liệu nào để hỗ trợ nó, tôi nghĩ nó đáng được hỏi. Ít nhất là cho bản ghi.Hành vi AUTO_INCREMENT của MySQL trong một hàng chèn

Như chúng ta đều biết, các trường AUTO_INCREMENT được tăng lên mỗi khi câu lệnh INSERT được thực thi. Và giá trị của nó có thể được lấy bởi hàm LAST_INSERT_ID(). Nó cũng được đề cập trong MySQL's Manual rằng với chèn nhiều hàng, LAST_INSERT_ID() sẽ trả về ID đầu tiên của các hàng được chèn. Mà tôi nghĩ là một ý tưởng hay (thực sự hữu ích).

Vì vậy, ở đây đi câu hỏi của tôi:

Tôi có thể giả định trong một tuyên bố INSERT IGNORE INTO với nhiều hàng, các ID chèn của một trường AUTO_INCREMENT sẽ luôn luôn được liên tục? Hãy nhớ rằng do sửa đổi IGNORE và tính chất đa người dùng của máy chủ MySQL, các kịch bản khác nhau có thể xảy ra.

Cảm ơn.

Trả lời

6

Không, bạn không thể giả định điều đó. Một kịch bản trong đó ID sẽ không được tuần tự là trong thiết lập đa chủ nhân rộng. Nếu ví dụ hai máy chủ tồn tại trong thiết lập như vậy, một trong những sẽ chỉ tạo ra ngay cả ID tự động, và chỉ khác lẻ ID (ghi nhớ nó chỉ là một ví dụ).

Tuy nhiên, nếu thiết lập của bạn không giống như vậy, thì có. Ít nhất trong chèn InnoDB là nguyên tử và được xếp hàng đợi khi nhắm mục tiêu cùng một bảng, do đó, ID của hai INSERT khác nhau sẽ không xen kẽ. (Nó không phải tài liệu mặc dù, vì vậy dựa vào nó là ... một chút mạo hiểm)


Làm thế nào tôi thử nghiệm IGNORE hệ INSERT ID:

mysql> CREATE TABLE `ignoreinsert` (
    -> `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    -> `uq` int(10) unsigned NOT NULL, 
    -> PRIMARY KEY (`ID`), 
    -> UNIQUE KEY `uq` (`uq`) 
    ->) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.19 sec) 

mysql> INSERT INTO ignoreinsert VALUES (null,1),(null,2); 
Query OK, 2 rows affected (0.10 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM ignoreinsert; 
+----+----+ 
| ID | uq | 
+----+----+ 
| 1 | 1 | 
| 2 | 2 | 
+----+----+ 
2 rows in set (0.00 sec) 

mysql> INSERT IGNORE INTO ignoreinsert VALUES (null,3),(null,1),(null,4),(null,2),(null,5); 
Query OK, 3 rows affected (0.08 sec) 
Records: 5 Duplicates: 2 Warnings: 0 

mysql> SELECT * FROM ignoreinsert; 
+----+----+ 
| ID | uq | 
+----+----+ 
| 1 | 1 | 
| 2 | 2 | 
| 3 | 3 | 
| 4 | 4 | 
| 5 | 5 | 
+----+----+ 
5 rows in set (0.00 sec) 
+0

Làm thế nào về 'modifier ignore', làm các hàng trùng lặp tạm ứng bộ đếm mặc dù chúng được lắp vào? Tôi hỏi điều này bởi vì tôi đã thấy rằng trong các câu lệnh 'INSERT' hàng đơn lẻ mà không có biến tố' IGNORE', bộ đếm được tăng lên khi một số lỗi xảy ra, mặc dù hàng không được chèn vào! – Mehran

+1

Mehran Ziadloo: Tôi vừa thực hiện kiểm tra để chắc chắn và các ID là tuần tự. – Mchl

+0

Lỗi của tôi, sử dụng công cụ sửa đổi 'IGNORE' sẽ không tăng bộ đếm. Đó là cho các hàng mà các lỗi key_ _duplicate được chuyển thành cảnh báo. – Mehran

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