Has*_*him 5 mysql database database-design types phpmyadmin
免责声明:我对数据库只有新手知识和经验。
我正在学习有关 Laracasts 的 Laravel 课程,在数据库视频中,讲师将 ID 列设置为SERIAL. 这与我在所有其他数据库教程中看到的完成方式不同,在这些教程中,他们通常会选中 A_I(自动增量)复选框,这会自动使列成为主列,并将类型保留为 INT 之类的类型。
将鼠标悬停在SERIALPHPMyAdmin 中的类型上会告诉我它是 的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,但是是否有特定的理由更喜欢它而不是检查 A_I 复选框设置的设置?这两种方式有什么优点或缺点吗?
我确实为 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_INCRMENT UNIQUE 的别名。
我发现这样做实际上很浪费,因为我通常将自动增量列声明为主键,这使得 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
Run Code Online (Sandbox Code Playgroud)
PS这个问题几乎但不完全重复What is the Difference Between SERIAL and AUTO_INCRMENT in mysql