在这个mysql示例中是否需要只包含一列的主表?

在这个mysql示例中是否需要只包含一列的主表?,mysql,database-design,Mysql,Database Design,我有一个mysql数据库,其中有一个表,保存多个其他表的版本信息。为了链接到同一个版本系列,我有一个版本主表,其中包含链接所指版本系列的主键。我想知道是否有一个更优雅的解决方案,而不需要一个版本的主表 CREATE TABLE IF NOT EXISTS `version` ( `version_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `version_master_id` int(10) unsigned NOT NULL, `major`

我有一个mysql数据库,其中有一个表,保存多个其他表的版本信息。为了链接到同一个版本系列,我有一个版本主表,其中包含链接所指版本系列的主键。我想知道是否有一个更优雅的解决方案,而不需要一个版本的主表

CREATE TABLE IF NOT EXISTS `version` (
`version_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`version_master_id` int(10) unsigned NOT NULL,
`major` int(10) unsigned NOT NULL DEFAULT '0',
`minor` int(10) unsigned NOT NULL DEFAULT '0',
`patch` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`version_id`));

CREATE TABLE IF NOT EXISTS `version_master` (
`version_master_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY);

CREATE TABLE IF NOT EXISTS `needs_versions` (
`needs_versions_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`name` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
`description` text COLLATE utf8_unicode_ci NOT NULL,
`version_master_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`needs_versions_id`));

在本例中,您当然可以删除
version\u master
表,并使用
version\u id
version\u master\u id
字段的组合作为索引。我想你可以放下它,因为似乎没有任何东西是用外键引用它的

但是,如果您有与每个版本系列相关的附加信息,那么拥有
version\u master
将是一个好主意


另外,您正试图从未定义的列
offer\u type\u id
中生成主键。不清楚您是否可以逻辑地将
需求\u版本
版本\u主版本
合并。这个名字本身不是很有描述性。我建议不要在表名中使用动词。

另一种常见的方法是使用序列

但MySQL似乎不支持它们,至少包含一节介绍如何使用一行一列表模拟序列:

创建一个表来保存序列 计数器并初始化它:

CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);
使用该表生成序列 像这样的数字:

UPDATE sequence SET id=LAST_INSERT_ID(id+1);
SELECT LAST_INSERT_ID();

谢谢提供类型id是复制粘贴错误,已更正。needs_versions表只是几个表的一个示例,这些表都链接到versions表以进行版本控制。我不太熟悉使用多列作为索引。如何在不自动增加版本主表的情况下快速创建新版本主表id。为了回答我自己的问题,我可以从版本中使用SELECT MAX(版本主表id)+1。只要它被编入索引,它应该是非常有效的。@SystemicPlumble,这将生成重复的ID,除非它保证只有一个连接可以这样做。在所有常见情况下,SELECT语句中都需要FOR UPDATE子句。@nhnb谢谢。我没想到。它使事情变得相当复杂(在我的例子中),这个解决方案也同样麻烦,因为我必须有一个单独的表来计算序列。然而,我认为如果版本变大,它将占用更少的空间,因为它只能容纳一行。