MySQL 序列与 id 列的自动增量

Posted

技术标签:

【中文标题】MySQL 序列与 id 列的自动增量【英文标题】:MySQL serial vs auto-increment for id column 【发布时间】:2021-05-01 17:33:09 【问题描述】:

免责声明:我对数据库只有新手知识和经验

我正在学习关于 Laracasts 的 Laravel 课程,在 database video 中,讲师将 ID 列设置为 SERIAL 类型。这与我在所有其他数据库教程中看到的不同,他们通常会检查 A_I(自动增量)复选框,这会自动使列成为主要列,并将类型保留为类似 INT。

将鼠标悬停在 phpMyAdmin 中的 SERIAL 类型上告诉我它是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名,但是是否有特别的理由更喜欢它而不是检查 A_I 复选框设置的设置?任何一种方式都有优点或缺点吗?

我确实找到了 PostgreSQL 的 this,表明 SERIAL 是旧的和过时的,但我找不到 mysql 的等效项,我不确定是否同样适用。

【问题讨论】:

Serial 只是 'INT AUTO_INCREMENT [NOT NULL]' 的简写。注意,使用的时候还是需要指定列是PRIMARY还是UNIQUE 【参考方案1】:

我确信 MySQL 的 SERIAL 类型的实现是为了让习惯 PostgreSQL 的人们更容易拥有一组适用于两种品牌数据库的 CREATE TABLE 语句,并且或多或少地做同样的事情.

在旧版本的 MySQL 手册中,指出SERIAL 是一个兼容性功能(没有命名它打算兼容的品牌)。删除了有关兼容性的语言(请参阅https://bugs.mysql.com/bug.php?id=7978)。

现在即使是 PostgreSQL 也改变了它的推荐做法,他们使用 IDENTITY 列而不是 SERIAL,所以 MySQL 特性真的没有必要了。

在 MySQL 中使用 SERIAL 没有任何优势。相反,如果您确实在 CREATE TABLE 语句中使用它,您将看到语法没有保存。如文档所述,它只是 BIGINT UNSIGNED AUTO_INCREMENT UNIQUE 的别名。

我发现这样做实际上很浪费,因为我通常将自动增量列声明为 PRIMARY KEY,这使得 UNIQUE 变得多余。所以你最终会无缘无故地得到 两个 唯一索引。

mysql> create table mytable (id serial primary key);

mysql> show create table mytable\G
*************************** 1. row ***************************
       Table: mytable
Create Table: CREATE TABLE `mytable` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`) -- this one is superfluous
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

附:这个问题几乎是What is the difference between SERIAL and AUTO_INCREMENT in mysql

【讨论】:

虽然打字还是少了 如果打字速度是你在软件工程中的瓶颈,那你就错了。 幸运的是,这不是我的领域 @BillKarwin 或者你能够以天才的速度思考。 ;)

以上是关于MySQL 序列与 id 列的自动增量的主要内容,如果未能解决你的问题,请参考以下文章

将自动增量 ID 添加到现有的升序列?

mysql自增

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

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

MySQL 序列和注入

MySQL 序列和注入