mysql - 如何解决或避免对具有多个 AUTO INCREMENT 列的 MySQL 的需求?

标签 mysql auto-increment multiple-columns

我在我的数据库设计上付出了很多努力,但我认为我是 现在意识到我犯了一个重大错误。

背景:(如果不需要背景,请跳至“问题”。)

数据库支持网站模板的自定义 CMS 层。的用户 模板仅限于打开和关闭页面,但不能创建 他们自己的"new"页面。此外,许多元素是不可编辑的。

因此,如果一个页面有一段文字,我希望他们能够编辑, 我会“手动”为它分配一个静态 ID:

<h2><%= CMS.getDataItemByID(123456) %></h2>

注:脚本语言与本题无关,但设计力 每个表都有唯一的列名。因此,'TableNameSingular_id' 的约定 用于主键等。

脚本语言会查找这些表以找到字符串。

mysql> SELECT * FROM CMSData WHERE CMSData_data_id = 123456;
+------------+-----------------+-----------------------------+
| CMSData_id | CMSData_data_id | CMSData_CMSDataType_type_id |
+------------+-----------------+-----------------------------+
|          1 |          123456 |                           1 |
+------------+-----------------+-----------------------------+

mysql> SELECT * FROM CMSDataTypes WHERE CMSDataType_type_id = 1;
+----------------+---------------------+-----------------------+------------------------+
| CMSDataType_id | CMSDataType_type_id | CMSDataType_type_name | CMSDataType_table_name |
+----------------+---------------------+-----------------------+------------------------+
|              1 |                   1 | String                | CMSStrings             |
+----------------+---------------------+-----------------------+------------------------+

mysql> SELECT * FROM CMSStrings WHERE CMSString_CMSData_data_id=123456;
+--------------+---------------------------+----------------------------------+
| CMSString_id | CMSString_CMSData_data_id | CMSString_string                 |
+--------------+--------------------------------------------------------------+
|            1 |                    123456 | The answer to the universe is 42.|
+--------------+---------------------------+----------------------------------+

渲染的文本将是:

<h2>The answer to the universe is 42.</h2>

这对“静态”元素非常有用,例如上面的示例。我用的完全一样 其他数据类型的方法,例如文件规范、电子邮件地址、日期等。

但是,当我想让用户动态生成内容时,它失败了。

例如,有一个“事件”页面,它们将由 用户点击“添加事件”或“删除事件”。

事件表将使用键来引用具有以下数据项的其他表:

Data Item:  Table:
--------------------------------------------------
Date        CMSDates
Title       CMSStrings (As show above)
Description CMSTexts   (MySQL TEXT data type.)
--------------------------------------------------

问题:

也就是说,每次创建事件时,我都需要创建 CMSData 表中的以下行;

+------------+-----------------+-----------------------------+
| CMSData_id | CMSData_data_id | CMSData_CMSDataType_type_id |
+------------+-----------------+-----------------------------+
|          x |               y |                           6 | (Event)
|        x+1 |             y+1 |                           5 | (Date)
|        x+2 |             y+2 |                           1 | (Title)
|        x+3 |             y+3 |                           3 | (Description)
+------------+-----------------+-----------------------------+

但是,问题来了。在 MySQL 中,您只能有 1 个 AUTO INCREMENT 字段。

如果我查询 CMSData_data_id 的最大值并只向其加 1,则 有可能存在竞争条件,其他人先捕获它。

这个问题通常是如何解决的——或者首先是如何避免的?

谢谢,

埃里克

最佳答案

id 应该是没有意义的,除非是唯一的。无论 4 个 ID block 是否连续,您的设计都应该有效。

重新设计您的实现以单独添加部件,而不是作为一个 4 block 。这样做应该可以简化整体事情,并提高您的可扩展性。

关于mysql - 如何解决或避免对具有多个 AUTO INCREMENT 列的 MySQL 的需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18559481/

相关文章:

MYSQL - 使用 SuperType/Subtype 和自动增量插入

sql - 每组值的自定义序列/自动增量

html - 具有多列布局的两个 div 的 CSS3 宽度,并排

css - 使用 div 创建多列布局

mysql - 更新mysql中的2个字段(其中1个更新为空更新)

PHP - uniqid() 会生成字母 ID 吗?

java - 在数据库中更新相同的值

mysql - 即使抛出异常 DUPLICATE KEY 或事务被回滚,auto_increment 值也会递增

mysql - 连接同一个表的多个列

MySQLFrequency频率报告