MySQL id 列的串行与自动递增

MySQL serial vs auto-increment for id column

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

我正在学习 Laracasts 上的 Laravel 课程,在 database video 中,讲师将 ID 列设置为 SERIAL 类型。这与我在所有其他数据库教程中看到的不同,他们通常会选中 A_I(自动递增)复选框,这会自动使列成为主要列,并使类型成为某种东西喜欢INT.

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

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

我确定 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

P.S。这个问题几乎但不完全是 What is the difference between SERIAL and AUTO_INCREMENT in mysql

的重复