MySQL Auto_increment đi 2 trên 2


8

Tôi đã cài đặt MySQL Workbench vào một ngày khác, truy cập cơ sở dữ liệu của công ty tôi và tạo cho mình một bảng để làm việc. Càng xa càng tốt. Vấn đề là, tôi nhận thấy auto_increment của tôi đang tăng 2 lên 2. Ví dụ:

ID    NAME
1     Paul
3     Jack
5     Louis
7     John
...

Khi tôi làm SHOW VARIABLES LIKE 'auto_inc%'tôi nhận được điều này:

'auto_increment_increment', '2'
'auto_increment_offset', '1'

Vì vậy, tôi đã cố gắng thiết lập auto_increment_incrementthành 1 với:

SET @@auto_increment_increment=1

Và sau khi xác minh lại với SHOW VARIABLES LIKE 'auto_inc%'tôi, tôi đã xác nhận nó "hoạt động" với kết quả:

'auto_increment_increment', '1'
'auto_increment_offset', '1'

Nhưng ID của tôi vẫn đang được tăng lên 2 lần 2 .

Lần đầu tiên tôi làm điều đó, nó hoạt động tốt và sau đó tôi đóng MySQL Workbench để nhận ra rằng khi tôi mở lại, nó auto_increment_incrementđược đặt thành 2 lần nữa. Bây giờ tôi đang cố gắng làm lại, nhưng nó dường như không còn hoạt động nữa.

Bất cứ ai có thể giúp tôi với điều này xin vui lòng?

Cảm ơn các bạn.


2
Tôi sẽ cẩn thận thay đổi giá trị này mà không hiểu đầy đủ lý do tại sao môi trường của công ty chúng tôi thiết lập điều đó. Chẳng hạn, đó là một biến chung để thay đổi khi chạy trong thiết lập sao chép đa chủ. Ngoài ra, chúng tôi có thể nhận được câu lệnh SHOW CREATE TABLE cho bảng mà bạn đang thử nghiệm không (thử nghiệm trên sản xuất cũng là một ý tưởng tồi, btw)
Derek Downey

Điều này xứng đáng là một câu trả lời tôi nghĩ. Hoặc để được thêm vào một cái hiện có, bất cứ điều gì bạn thích. Hành động tốt nhất là hành động thận trọng - hoặc không có hành động nào - đối với các DBA muốn giữ công việc của họ.
ypercubeᵀᴹ

Câu trả lời:


7

Tiền tố đã được sử dụng:

SET @@auto_increment_increment=1;

Giống như:

SET @@SESSION.auto_increment_increment=1;

Khi sửa đổi cài đặt này, nó chỉ có liên quan trong phiên hiện tại của bạn.

Để sửa lỗi lâu dài hơn, hãy thử:

SET GLOBAL auto_increment_increment=1;

Giống như:

SET @@GLOBAL.auto_increment_increment=1;

Huh, tôi nghĩ @@ là thuộc tính phiên. Từ hướng dẫn sử dụng mysql: "Để chỉ rõ rằng một biến là biến phiên, đặt trước tên của nó bằng SESSION, @@ session., Hoặc @@" dev.mysql.com/doc/refman/5.1/en/set-option. html
Derek Downey

Hmm .. vậy đó. Khôi phục câu trả lời đầu tiên của tôi.
Morgan Tocker

Này Morgan, cảm ơn vì đã trả lời! Nhưng điều gì sẽ xảy ra nếu tôi không muốn hoặc không thể thực hiện TẬP HỢP TOÀN CẦU? Tôi có thể chỉ đặt nó cho db / bảng rất cụ thể của mình mà không phải sử dụng các biến phiên không?
Bernardo Oliveira

Nếu bạn không thể THIẾT LẬP TOÀN CẦU, mỗi phiên bạn không muốn hành vi này chạy SET auto_increment_increment = 1;
Morgan Tocker

2

Cả hai biến có giá trị toàn cầu và phiên. Vì vậy, rất có thể bạn chỉ thay đổi giá trị của phiên đã biến mất khi bạn đóng Bàn làm việc MySQL.

Một cảnh báo khác cần chú ý, đó là

các biến này kiểm soát hành vi của tất cả các cột AUTO_INCREMENT trong tất cả các bảng trên máy chủ MySQL. Nếu giá trị toàn cầu của một trong hai biến được đặt, các hiệu ứng của nó sẽ tồn tại cho đến khi giá trị toàn cầu được thay đổi hoặc ghi đè bằng cách đặt giá trị phiên hoặc cho đến khi mysqld được khởi động lại. Nếu giá trị cục bộ được đặt, giá trị mới sẽ ảnh hưởng đến các cột AUTO_INCREMENT cho tất cả các bảng trong đó các hàng mới được người dùng hiện tại chèn vào trong suốt thời gian của phiên, trừ khi các giá trị được thay đổi trong phiên đó.

Điều gì cũng có thể lừa bạn, là cách tính giá trị tự động tiếp theo khi bạn thay đổi kích thước gia tăng. Nó không sử dụng giá trị cột được lưu trữ cuối cùng, nhưng nó đang tính giá trị cao nhất tiếp theo bằng công thức

auto_increment_offset + N × auto_increment_increment

trong khi N là một số nguyên, do đó giá trị mới lớn hơn giá trị lớn nhất hiện có.

Xem tài liệu auto_increment_increment cách nó hoạt động chi tiết.


Đó là thông tin rất hữu ích. Cảm ơn MicSim! Quả thực tôi chỉ thay đổi giá trị phiên. Cố gắng tìm ra cách thay đổi vĩnh viễn nhưng chỉ với một db hoặc bảng. Có ý kiến ​​gì không?
Bernardo Oliveira

Như tài liệu nói, không thể đặt db hoặc theo bảng. Tôi xin lỗi, tôi không thể giúp bạn ở đây. Có thể bạn đang cố gắng đạt được điều gì đó với tính năng tự động tăng tốc mà nó không dành cho.
MicSim
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.