多条记录的MySql唯一id

多条记录的MySql唯一id,mysql,transactions,Mysql,Transactions,我使用一个带有一些临时列的表,如id、名称、电子邮件等。此外,我在每个事务中插入可变数量的记录,为了更高效,我需要有一个唯一的id,我们称之为事务id,这对于插入到一个事务中的每组数据都是相同的,应该是递增的。这样做的最佳方法是什么? 我被认为使用 select max(transaction_id) from users 并在服务器端增加该值,但这与旧式解决方案类似。使用自动增量列添加新表 可以使用列创建新表。因此,您将能够以线程安全的方式生成唯一的整数。它的工作原理如下: DB::ins

我使用一个带有一些临时列的表,如id、名称、电子邮件等。此外,我在每个事务中插入可变数量的记录,为了更高效,我需要有一个唯一的id,我们称之为事务id,这对于插入到一个事务中的每组数据都是相同的,应该是递增的。这样做的最佳方法是什么? 我被认为使用

select max(transaction_id) from users 
并在服务器端增加该值,但这与旧式解决方案类似。

使用自动增量列添加新表 可以使用列创建新表。因此,您将能够以线程安全的方式生成唯一的整数。它的工作原理如下:

DB::insert_into_transaction_table()
transaction_id = DB::mysql_last_insert_id() ## this is integer value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
transaction_id = new_GUID() ## this is usually a string value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
您不需要mysql事务来完成此任务

插入前在服务器端生成唯一字符串 例如,您可以在服务器端生成唯一id,并将其用于插入所有记录。但是,您的事务id字段应该足够长,以存储通过这种方式生成的值。。。类型它的工作原理如下:

DB::insert_into_transaction_table()
transaction_id = DB::mysql_last_insert_id() ## this is integer value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
transaction_id = new_GUID() ## this is usually a string value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
添加具有自动增量列的新表 可以使用列创建新表。因此,您将能够以线程安全的方式生成唯一的整数。它的工作原理如下:

DB::insert_into_transaction_table()
transaction_id = DB::mysql_last_insert_id() ## this is integer value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
transaction_id = new_GUID() ## this is usually a string value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
您不需要mysql事务来完成此任务

插入前在服务器端生成唯一字符串 例如,您可以在服务器端生成唯一id,并将其用于插入所有记录。但是,您的事务id字段应该足够长,以存储通过这种方式生成的值。。。类型它的工作原理如下:

DB::insert_into_transaction_table()
transaction_id = DB::mysql_last_insert_id() ## this is integer value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
transaction_id = new_GUID() ## this is usually a string value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)

您可以使用另一个具有自动递增主键的表usergroups,首先在其中插入一条记录,其中可能包含有关该组的其他有用信息。然后使用mysql_insert_id获取在最后一次插入期间生成的组的唯一id,并将其用作插入第一个表的groupid


这样,您仍然在使用MySQL的自动编号,这保证了您有一个唯一的groupid。从用户选择maxtransaction\u id并递增这是不安全的,因为它是非原子的,在您更改增量之前,另一个线程可能已经读取了相同的maxtransaction\u id,并且将开始插入具有冲突groupid的记录。

您可以拥有另一个具有自动递增主键的表usergroups,首先在那里插入一条记录,其中可能包含有关该组的其他有用信息。然后使用mysql_insert_id获取在最后一次插入期间生成的组的唯一id,并将其用作插入第一个表的groupid


这样,您仍然在使用MySQL的自动编号,这保证了您有一个唯一的groupid。从用户处选择maxtransaction\u id并递增是不安全的,因为它是非原子的,在您更改增量之前,另一个线程可能已经读取了相同的maxtransaction\u id,并将开始插入具有冲突groupid的记录。

这将导致每个插入都具有唯一的id。我不认为这是他的意思,他想对多个记录使用相同的ID,但每批或每组插入都有一个唯一的ID。我建议您为此创建一个单独的表。它只能有一列。你也需要交易。到目前为止,mysql中还没有序列。我已经用这个想法更新了unswer。并在没有新表的情况下添加了变体这将导致每个插入都有一个唯一的ID。我不认为这是他的意思,他想对多个记录使用相同的ID,但每批或每组插入都有一个唯一的ID。我建议您为此创建一个单独的表。它只能有一列。你也需要交易。到目前为止,mysql中还没有序列。我已经用这个想法更新了unswer。在没有新表的情况下添加了variant是合理的,但是如果你仔细阅读我的帖子,有人提到我想避免使用你在第二段中编写的一些附加表来使用usergroups表是的,我知道这不是最安全的方法。有些数据库中包含自己的生成器,可以在这里使用,对此进行一些模拟,但不太确定。您没有指定不需要其他表。但是,如果这不是一个选项,我认为您所拥有的解决方案——尽管不安全,除非您在一个事务中执行select和all INSERT,否则您将需要一个InnoDB表,并且可能有点麻烦——是您所能做的最好的解决方案。我知道postgresql有自动递增的生成器,它们也用于您可以调用的唯一ID,但我认为MySQL没有类似的功能……在MySQL中,您避免了额外的表,这是一个严重的设计错误。如果您在Oracle中,可以使用SEQUENCE对象,但MySQL的做法是使用带有自动增量主键的表。很抱歉直截了当。我做这件事给我留下了烙印。听起来很合理,但如果你仔细阅读我的帖子,我被提到我想避免使用你编写的一些额外的表来为seco使用usergroups表
是的,我知道这不是最安全的方法。有些数据库中包含自己的生成器,可以在这里使用,对此进行一些模拟,但不太确定。您没有指定不需要其他表。但是,如果这不是一个选项,我认为您所拥有的解决方案——尽管不安全,除非您在一个事务中执行select和all INSERT,否则您将需要一个InnoDB表,并且可能有点麻烦——是您所能做的最好的解决方案。我知道postgresql有自动递增的生成器,它们也用于您可以调用的唯一ID,但我认为MySQL没有类似的功能……在MySQL中,您避免了额外的表,这是一个严重的设计错误。如果您在Oracle中,可以使用SEQUENCE对象,但MySQL的做法是使用带有自动增量主键的表。很抱歉直截了当。这样做会给我留下烙印。除非你的mySQL服务器从未有过多个连接,否则不要这样做。如果你这样做,你会得到重复的值。除非你从来没有一个以上的连接到你的mySQL服务器,否则不要这样做。如果你这样做,你会得到重复的值。