几个记录的MySql唯一ID

时间:2009-11-11 16:25:50

标签: mysql transactions

我使用一个表,其中有一些随意的列,如id,name,email等...我也在每个事务中插入一个可变数量的记录,为了提高效率我需要有一个唯一的id让我们调用事务id,对于插入一个事务中的每组数据都是相同的,应该是递增的。这样做的最佳方法是什么? 我被认为使用

select max(transaction_id) from users 

并在服务器端增加该值,但这样的接缝就像旧时尚解决方案一样。

2 个答案:

答案 0 :(得分:2)

使用auto_increment column

添加新表

您可以使用auto_increment列创建新表格。因此,您将能够以线程安全的方式生成唯一的整数。它会像这样工作:

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...)

并且您不需要mysql事务。

在插入

之前在服务器端生成唯一字符串

您可以在服务器端生成唯一ID(例如GUID)并将其用于所有插入的记录。但是您的transaction_id字段应足够长,以存储以这种方式生成的值(某些char(...)类型)。它会像这样工作:

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

答案 1 :(得分:2)

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

这样你仍然使用MySQL的自动编号,它可以保证你有一个独特的groupid。执行select max(transaction_id) from users并增加它是不安全的,因为它是非原子的(另一个线程可能在你有一个更改增加它之前读取相同的max(transaction_id),并将开始插入带有有冲突的groupid)。