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 列的自动增量的主要内容,如果未能解决你的问题,请参考以下文章