Jestem bardzo zaniepokojony tym dziwnym zachowaniem, które widzę w auto_increment
wartości zapisanej w bidID tabeli ofert po wykonaniu masowego wstawiania przy użyciu procedury składowanej:
INSERT INTO Bids (itemID, buyerID, bidPrice)
SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice)
FROM Items
WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows;
Na przykład, jeśli auto_increment
wartość bidID wynosi 101 na początku, a wstawiłem 100 wierszy, wartość końcowa staje się 213 zamiast 201. Jednak bidID tych wstawionych wierszy działa sekwencyjnie do maksymalnie 201.
Po sprawdzeniu,
SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
Nie mam pojęcia, dlaczego tak się dzieje. Co może powodować skok auto increment
wartości?
mysql
innodb
mariadb
auto-increment
Przepełnienie pytania
źródło
źródło
show variables like '%innodb_autoinc_lock_mode%';
produkcją?Odpowiedzi:
Nie jest to niczym niezwykłym i istnieje kilka przyczyn. Czasami jest to spowodowane optymalizacjami wykonywanymi przez moduł uruchamiający kwerendy, aby zmniejszyć problemy rywalizacji z zasobem licznika, poprawiając wydajność, gdy istnieją równoległe aktualizacje tabeli, której dotyczy problem. Czasami jest to spowodowane transakcjami, które zostały jawnie wycofane (lub domyślnie wycofane z powodu napotkania błędu).
Jedynymi gwarancjami z
auto_increment
kolumny (lubIDENTITY
w MSSQL i innych nazwach, pod którymi kryje się ta koncepcja) jest to, że każda wartość będzie unikalna i nigdy mniejsza niż poprzednia: możesz więc polegać na wartościach przy zamawianiu, ale nie możesz polegać na aby nie mieć luk.Jeśli potrzebujesz, aby wartości w kolumnie nie miały żadnych luk, będziesz musiał samodzielnie zarządzać wartościami, albo w innej warstwie logiki biznesowej, albo w DB za pomocą wyzwalacza (uważaj jednak na potencjalne problemy z wydajnością z wyzwalaczami), oczywiście jeśli robisz własne, będziesz musiał zmagać się ze wszystkimi problemami współbieżności / przywracania / czyszczenia po usunięciu / innymi problemami, na które działają silniki DB, dopuszczając luki).
źródło