While performing INSERT...ON DUPLICATE KEY UPDATE
on InnoDB in MySQL, we are often told to ignore the potential gaps in auto_increment
columns. What if such gaps are very likely and cannot be ignored?
As an example, suppose there is one table rating
that stores the users' ratings of items. The table scheme is something like
CREATE TABLE rating (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
item_id INT NOT NULL,
rating INT NOT NULL,
UNIQUE KEY tuple (user_id, item_id),
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (item_id) REFERENCES item(id)
);
It is possible that there are many users and many items, while users may frequently change the ratings of items that they have already rated before. Every time a rating is changed, a gap is created if we use INSERT...ON DUPLICATE KEY UPDATE
, otherwise we will have to query twice (do a SELECT
first) which is performance harming or check affected rows
which cannot accommodate multiple records INSERT
.
For some system where 100K users each has rated 10 items and changes half of the ratings every day, the auto_increment
id will be exhausted within two years. Then what should we do to prevent it in practice?