2

对于一个项目,我需要在 MySQL 数据库中实现行版本控制。在阅读了可能的解决方案后,我选择使用一个表并添加一个start_dateend_date列,指定该版本/行何时处于活动状态。

对于行的多个版本,该id列将是相同的。因此它在表中不再是唯一的。现在我不确定如何设置主键(和其他索引),同时保持id列的自动增量活动。

我看到两个选项。第一个id只是创建一个索引,如下所示:

CREATE TABLE `thing` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  … other_columns …,
  `start_date` datetime NOT NULL,
  `end_date` datetime DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

另一个是制作idstart_date主键,像这样:

CREATE TABLE `thing` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  … other_columns …,
  `start_date` datetime NOT NULL,
  `end_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`,`start_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

最好的选择是什么,尤其是在考虑性能时?


例如,数据将如下所示:

id | some_column | start_date | end_date
---|-------------|------------|-----------
1  | Jonathn     | 2013-01-01 | 2013-01-02
1  | Jonathan    | 2013-01-02 | NULL
2  | James       | 2013-02-01 | NULL

在这种情况下,我添加了“Jonathn”,但后来将其更改为“Jonathan”(同时保持相同的 ID)。稍后添加另一行(“James”)。

4

1 回答 1

0

您的第一个示例 CREATE TABLE 语句没有键*,您的第二个有。我认为你的第二个例子就是你想要的:

CREATE TABLE `thing` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  … other_columns …,
  `start_date` datetime NOT NULL,
  `end_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`,`start_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

您可能希望也可能不希望 id 成为自动递增列,但这主要是功能问题(您希望能够生成递增值还是自己插入它们)而不是逻辑设计或性能问题。

*MySQL 不幸地使用关键字KEY来指定索引。必须使用UNIQUE KEYorPRIMARY KEY语法指定键。

于 2013-09-19T05:05:55.887 回答