我正在进行一些研究,以解决可能发生的问题。 假设您拥有一个带有ID和名称字段的InnoDB MySQL表。ID字段具有BIGINT(20)并且是AUTO_INCREMENT,并且它是主键。
如果这个表已经满了,也就是说我们已经达到了ID的上限,无法再生成自增数字,那么您会怎么做?
我正在进行一些研究,以解决可能发生的问题。 假设您拥有一个带有ID和名称字段的InnoDB MySQL表。ID字段具有BIGINT(20)并且是AUTO_INCREMENT,并且它是主键。
如果这个表已经满了,也就是说我们已经达到了ID的上限,无法再生成自增数字,那么您会怎么做?
假设有一个类似于以下结构的表:
CREATE TABLE `tbl` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
);
像下面这样的INSERT
查询:
INSERT INTO tbl(id) VALUES (NULL);
在实际代码中表格中还有其他列,并且它们也在INSERT查询中出现,但我们可以安全地忽略它们,因为它们与该特定问题无关。
当列id的值达到其最大值时,使用上述查询将无法插入更多行到表中。下一个INSERT将失败并显示以下错误:
SQL错误(167):对于列'id',值超出范围。
如果列id的值存在间隙,则仍然可以插入使用表中不存在的值的行,但必须在INSERT查询中指定id的值。
不管怎样,如果您的AUTO_INCREMENT列的类型是BIGINT,您就不必担心。
假设代码每秒插入一百万条记录(这是高估的,甚至可以说是不可能的),则针对id列有足够的值可以支持接下来的500万年。或者如果该列没有UNSIGNED,则只有292,277
年。
我曾目睹一台使用INT(11)(而不是UNSIGNED)作为记录网站访问信息的表的自增PK的现场Web服务器的行为。 在正常运行了几年后,在访问数量达到2^31(20多亿)时它失败了。
将列类型从INT更改为BIGINT不是二十亿条记录表的解决方案(完成需要很长时间,而当系统运行时,时间永远不够)。解决方案是创建一个具有相同结构但具有PK列的BIGINT和AUTO_INCREMENT列的初始值的新表,然后切换表:
CREATE TABLE `tbl_new` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=2200000000;
RENAME TABLE `tbl` TO `tbl_old`, `tbl_new` TO `tbl`;
RENAME TABLE
的作用就是更改现有表的名称。在这里,我们需要将tbl_new
重命名为tbl
,但是表tbl
已经存在,我们仍然需要它。这就是为什么我们首先将tbl
重命名为tbl_old
,然后将tbl_new
放在tbl
的位置上。需要进行两次重命名,但使用两个RENAME TABLE
语句来执行它们会产生一个时间间隔,在此期间名为tbl
的表不存在,这可能会破坏其他查询。通过使用单个语句执行两个重命名操作,该操作是原子性的,并且在表tbl
不存在的情况下没有时间间隔。 - axiactinyint: 1 byte, -128 to +127 / 0 to 255 (unsigned)
smallint: 2 bytes, -32,768 to +32,767 / 0 to 65,535 (unsigned)
mediumint: 3 bytes, -8,388,608 to 8,388,607 / 0 to 16,777,215 (unsigned)
int/integer: 4 bytes, -2,147,483,648 to +2,147,483,647 / 0 to 4,294,967,295 (unsigned)
bigint: 8 bytes, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 / 0 to 18,446,744,073,709,551,615 (unsigned)
你认为这个数字很小吗?也许在你达到这个数字之前,你已经死了。
code
tinyint: 1 byte, -128 to +127 / 0 to 255 (unsigned) smallint: 2 bytes, -32,768 to +32,767 / 0 to 65,535 (unsigned) mediumint: 3 bytes, -8,388,608 to 8,388,607 / 0 to 16,777,215 (unsigned) int/integer: 4 bytes, -2,147,483,648 to +2,147,483,647 / 0 to 4,294,967,295 (unsigned) bigint: 8 bytes, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 / 0 to 18,446,744,073,709,551,615 (unsigned)code
- mohamad mohamad