【问题标题】:MySql unique id for several records多条记录的MySql唯一ID
【发布时间】:2009-11-11 16:25:50
【问题描述】:

我使用一张表,其中包含一些随意的列,例如 id、name、email 等……我还在每笔交易中插入可变数量的记录,为了提高效率,我需要一个唯一的 id 让我们调用对于插入到一个事务中的每组数据来说,它的事务 id 应该是相同的,应该是递增的。这样做的最佳方法是什么? 我被认为使用

select max(transaction_id) from users 

并在服务器端增加该值,但这看起来像是老式的解决方案。

【问题讨论】:

  • 除非您与 mySQL 服务器的连接不超过一个,否则不要执行此 max() 技巧。如果你这样做,你会得到重复的值。

标签: mysql transactions


【解决方案1】:

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

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

【讨论】:

  • 听起来很合理,但如果你仔细阅读我的帖子,我提到我想避免在第二段中使用一些额外的表(你写的是使用 usergroups 表)是的,我知道那是不是最安全的方式。一些数据库有自己的生成器,可以在这里使用,一些模拟,但不太确定。
  • 您没有指定不需要其他表。但是,如果这不是一个选项,我认为您拥有的解决方案 - 虽然不安全(除非您在一个事务中执行选择和所有插入,否则您将需要一个 InnoDB 表)并且可能有点麻烦 - 是最好的做。我知道 postgresql 有你可以调用的自动递增生成器(也用于唯一 id),但我认为 MySQL 没有类似的东西......
  • 在 MySQL 中,通过避免额外的表,您犯了一个严重的设计错误。如果你在 Oracle 中,你可以使用一个 SEQUENCE 对象,但是一个具有自动增量主键的表是 MySQL 这样做的方式。很抱歉直言不讳。这样做我身上有焦痕。
【解决方案2】:

使用 auto_increment 列添加新表

您可以使用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...)

【讨论】:

  • 这将产生一个对每个插入唯一的ID。我不认为这是他的意思,他想对多条记录使用相同的 ID,但每个 batchgroup 插入都有一个唯一的 ID。
  • 我建议您为此创建一个单独的表。它只能有一个列。你也需要交易。目前mysql中没有序列。
  • 我已经用这个想法更新了 unswer。并添加了没有新表的变体
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多