Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中手动生成int主键_Sql_Mysql - Fatal编程技术网

在mysql中手动生成int主键

在mysql中手动生成int主键,sql,mysql,Sql,Mysql,使用mysql手动生成int主键的最佳方法是什么 我不想使用自动增量功能 我教过创建一个表,其中一列的类型为int,命名为sequence。所以每次我要插入一条新记录时,首先检查这个列,并使用这个值作为主键。然后在插入成功后,增加序列的值 这是一个好方法吗?我认为这是非常合理的,只要给定表中下一个序列的值是通过一个函数或过程传递的,该函数或过程本身会更新序列表以确保唯一性,而不是通过 select max(id) + 1 from ... 我认为这是非常合理的,只要给定表中的下一个序列的值是通

使用mysql手动生成int主键的最佳方法是什么

我不想使用自动增量功能

我教过创建一个表,其中一列的类型为int,命名为sequence。所以每次我要插入一条新记录时,首先检查这个列,并使用这个值作为主键。然后在插入成功后,增加序列的值


这是一个好方法吗?

我认为这是非常合理的,只要给定表中下一个序列的值是通过一个函数或过程传递的,该函数或过程本身会更新序列表以确保唯一性,而不是通过

select max(id) + 1 from ...

我认为这是非常合理的,只要给定表中的下一个序列的值是通过函数或过程传递的,该函数或过程本身会更新序列表以确保唯一性,而不是通过

select max(id) + 1 from ...

这种方法是可行的,但您需要有一个事务来封装这些不同的原子操作,包括查找、插入和递增


然而,您能详细说明一下为什么自动增量列不够好吗?它是一种安全且有保证的数据库功能,因此,除非您有令人信服的理由,否则我将坚持使用它。

这种方法是有效的,但您需要有一个事务来封装这些不同的原子操作:查找、插入和递增


然而,您能详细说明一下为什么自动增量列不够好吗?它是一种安全且有保证的数据库功能,因此除非您有令人信服的理由,否则我将坚持使用它。

创建一个表,其中包含一个int列,类型为InnoDB:

然后,当您想要获取密钥的新值时,必须使用正在使用的API启动事务,然后:

SELECT next_value FROM key_table FOR UPDATE
然后读取返回的值,它是主键的值。然后,要在仍处于同一事务中时增加值,请执行:

然后提交您的事务


当且仅当您使用如上所述的事务并使用InnoDB表类型时,这将确保完全一致性。

使用InnoDB类型的一个int列创建一个表:

然后,当您想要获取密钥的新值时,必须使用正在使用的API启动事务,然后:

SELECT next_value FROM key_table FOR UPDATE
然后读取返回的值,它是主键的值。然后,要在仍处于同一事务中时增加值,请执行:

然后提交您的事务


当且仅当您使用上述事务并使用InnoDB表类型时,这将确保完全一致性。

Hello。我不想使用autoincrement,因为我认为它不够安全,因为插入后我想获取当前id;选择last_insert_id作为lastId;如果我使用这个aproach,即使它是在一个事务上,我不知道如果在第一次插入之后,在另一个表中有另一个带有autoincrement的插入,会发生什么。然后我执行SELECT last_insert_id作为lastId;哪个将是lastId的值?我插入的第一个表的最后一个id还是第二个?我想您需要阅读“同意代码Duck”。您担心最后一个\u INSERT\u ID会受到其他插入操作的影响。然而,如果您正在执行一个简单的表插入;键入命令,其他插入是否在其他连接上发生并不重要,因为最后一个插入ID是特定于连接的。>生成的ID在服务器中按每个连接进行维护。所以,只要你在做简单的插入,就只需使用最后一个插入ID。如果你使用的是存储过程或其他会导致二次插入的功能,则会出现例外,但你可能不会。非常感谢。我不知道上次插入的id是特定于一个连接的。您好。我不想使用autoincrement,因为我认为它不够安全,因为插入后我想获取当前id;选择last_insert_id作为lastId;如果我使用这个aproach,即使它是在一个事务上,我不知道如果在第一次插入之后,在另一个表中有另一个带有autoincrement的插入,会发生什么。然后我执行SELECT last_insert_id作为lastId;哪个将是lastId的值?我插入的第一个表的最后一个id还是第二个?我想您需要阅读“同意代码Duck”。您担心最后一个\u INSERT\u ID会受到其他插入操作的影响。然而,如果您正在执行一个简单的表插入;键入命令,其他插入是否在其他连接上发生并不重要,因为最后一个插入ID是特定于连接的。>生成的ID在服务器中按每个连接进行维护。所以,只要你在做简单的插入,就只需使用最后一个插入ID。如果你使用的是存储过程或其他会导致二次插入的功能,则会出现例外,但你可能不会。非常感谢。我不知道上一个id是某个公司的
另外,如果批量获取新密钥,则可以获得更好的性能。将上述查询调整为每次递增1000而不是1,这样您就知道,没有其他人可以在下一个值之后拥有1000个键值。然后在内存中保留一个计数器,并在每次使用键时将其递增1。当它达到原始值+1000时,您必须从数据库中再获取1000个键。这就是Hibernate的串行密钥生成器的工作方式。另外,如果批量获取新密钥,您可以获得更好的性能。将上述查询调整为每次递增1000而不是1,这样您就知道,没有其他人可以在下一个值之后拥有1000个键值。然后在内存中保留一个计数器,并在每次使用键时将其递增1。当它达到原始值+1000时,您必须从数据库中再获取1000个键。这就是Hibernate的串行密钥生成器的工作方式。