【问题标题】:Inserting a unique value WITHOUT auto-increment插入一个没有自动增量的唯一值
【发布时间】:2012-01-16 07:03:56
【问题描述】:

为了解释的简单起见,想象一个房间里挤满了互相交谈的人。一个人对另一个人的每一句话都会成为这张表中的一条记录,所有这些记录都有一个通过自增分配的唯一ID。

但是,并不是这个房间里的每个人都在和其他人交谈。有多个对话正在进行。

这些对话彼此之间必须是独一无二的。这将防止重复的对话 ID 被启动,并且该网站会收集不属于该人的所有陈述。

或者,以图形表示:

----------------------------------------------
| MessageID | ConvoID | Sender | Recipients | etc...
----------------------------------------------
|    1      |    1    |   A    |     B      |
----------------------------------------------
|    2      |    1    |   B    |     A      |
----------------------------------------------
|    3      |    2    |   C    |     D      |
----------------------------------------------
|    4      |    1    |   A    |     B      |
----------------------------------------------
|    5      |    2    |   D    |     C      |
----------------------------------------------
|    6      |    1    |   B    |     E      |
----------------------------------------------
|    7      |    3    |   E    |     F      |
----------------------------------------------

您实际上可以在这里看到正在发生的对话... A 与 B (ID 1) 交谈,B (ID 2) 大约在同一时间回复了 (ID 2) C 与 D 开始了新的对话 (CID 2) ( ID 3)。

A 最终向 B 反馈某事(ID 4),而 D 最终回应了 C 之前的询问(ID 5)。然后 B 与 E 谈论他与 A 谈论的同一件事 (CID 1),然后 E 右转并与 F 连接以开始一个全新的对话。

如果这读起来像员工立即解雇之前发生的步骤,那不是故意的,但您并不孤单。

因此您可以看到每个 DB 条目都有一个唯一的 ID (MessageID),但是这些消息需要很容易地整理在一起。

我正在寻求的解决方案是允许数据库创建一个新的和唯一的“ConvoID”。这就是为什么我们不能自动递增,或者我们不能在数据集上强制唯一性的原因。由于本专栏所做的事情的性质,必须发生重复,但自动增量可能会与我正在寻找的完全相反。

任何可以为我指明正确方向的帮助将不胜感激。

谢谢!

【问题讨论】:

  • 我不知道我是不是真的明白了,但是你为什么不使用Sender + Recipient作为PK呢?或者您可以添加一个唯一约束以确保发件人 + 收件人是唯一的。
  • 应该分成两个或多个表,但我对确切的要求感到困惑。
  • 如果您真的想在单个表中执行此操作,请显式锁定表并在插入时使用 MAX(ConvoID) + 1 作为新的 ConvoID。但我不能推荐这个解决方案。

标签: php mysql sql


【解决方案1】:

您可以通过添加Conversations 表来规范化设计。该表将有自己的自动递增列。每当开始新的对话时,您都会向Conversations 添加一行,并将其标识符用作ConvoID

【讨论】:

  • 嗯...这可能是解决此问题的最简单方法。 lqez 提到的想法闪过我的脑海(一个显式锁定),但出于同样的原因(我怀疑)他不能推荐它,我想避免这种情况。
  • 因此,一个带有唯一 MessageID 的“Messages”表,然后是一个单独的“Conversations”表——其中的每条记录都有自己唯一的 A-I 分配 ID,然后是 - 比如说 - 第二个以逗号分隔的数字列,表示 Messages 表中的 MessageID。听起来比我最初的想法更简单的解决方案,并寻求帮助。我要先给它一些测试,但我想我有我的答案!谢谢!
  • 经过测试,有效。就像我一直在寻找它一样。非常感谢,安多玛! :-)
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2021-11-19
相关资源
最近更新 更多