gpt4 book ai didi

MySQL序列与id列的自动递增

转载 作者:行者123 更新时间:2023-12-05 04:53:53 26 4
gpt4 key购买 nike

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

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

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

我确实找到了 this对于 PostgreSQL,指示 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

附言这个问题几乎但不完全是What is the difference between SERIAL and AUTO_INCREMENT in mysql的重复。

关于MySQL序列与id列的自动递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65926663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com