gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:26:45 25 4
gpt4 key购买 nike

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

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

数据库支持网站模板的自定义 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com