SQL标识列
在本教程中,我们将学习SQL中的标识列。我们从基础知识开始,讨论什么是标识列、标识列的特征,以及如何创建和使用它们。
出于演示目的,我们将使用MySQL数据库来展示如何创建和使用标识列。请记住,标识列的定义和实现因数据库引擎而异。
什么是身份列?
让我们从基础知识开始,讨论什么是标识列。在SQL中,标识列是一种特殊类型的列,它允许数据库引擎为添加到表中的每条记录自动生成唯一和顺序的数值。
虽然这不是必需的,但我们主要使用标识列作为表的主键,以确保每一行都有唯一的标识符。你也可能听到标识列的名字是“auto increment column”(MySQL)或“serial”(PostgreSQL)。
单位列的特征
以下是单位列的一些属性。其中一些特征在整个数据库引擎中持续存在:
- 自动递增——标识列的值由数据库引擎自动生成和递增。除非指定,否则这些值从1开始,每添加一行增加1。
- 唯一性——标识列的每个值在表中是唯一的。这有助于确保数据的完整性,特别是当用作主键时。
- 顺序的—这些值由数据库引擎顺序生成。如前所述,除非显式指定,否则数据库从1开始,并为每个新行增加1,没有间隙或重叠。
- 不变性——标识列的值是不可变的。一旦分配,即使使用更新表子句也不能更改它。这是因为修改该值会导致数据不一致,从而消除了主键的唯一目的。
这些是SQL中标识列的一些特征。
语法:
定义标识列的SQL语法在不同的数据库管理系统之间可能略有不同。然而,概念是一样的。
column_name data_type生成{ALWAYS | BY DEFAULT}作为IDENTITY[(sequence_option)]
在给定的语法中:
- “data_type”表示标识列的数据类型。这可以是任何整数数据类型。
- GENERATED ALWAYS子句告诉数据库引擎为标识列生成顺序整数。这将自动阻止您手动插入或更新标识列的值。
- generate BY DEFAULT告诉数据库引擎,它可以自动生成标识列的值,但我们可以手动插入或更新其值。
例子:
让我们看一些关于如何在SQL中实现标识列的示例。
例1:始终生成
第一种是使用generatedalways子句,它将标识列的功能留给数据库引擎。
考虑下面的例子:
创建表vpc_mapping
生成的id INT总是作为身份,
vpc_name VARCHAR (255),
mapping_description文本,
vpc_id VARCHAR (50),
subnet_id VARCHAR (50),
状态VARCHAR(20)不空,
地区VARCHAR (50),
主键(id)
);
在给定的示例中,我们创建了一个名为“vpc_mapping”的表,其中包含有关vpc网络的详细信息。
但是,请注意ID列。我们将列的数据类型设置为int,并使用generatedalways as IDENTITY告诉数据库引擎,我们希望将该列创建为由数据库引擎管理的标识列。
然后,我们可以在不提供列值的情况下将行插入到表中,如下所示:
插入
成
vpc_mapping (vpc_name
mapping_description,
vpc_id,
subnet_id,
的地位,
地区)
“生产VPC”,
“生产环境的主VPC”,
“vpc - 123456”,
“子网- 789012”,
“活跃”,
“us-east-1”);
插入
成
vpc_mapping (vpc_name
mapping_description,
vpc_id,
subnet_id,
的地位,
地区)
“开发VPC”;
开发和测试VPC
“vpc - 789012”,
“子网- 345678”,
“不活跃”,
“us-west-2”);
插入
成
vpc_mapping (vpc_name
mapping_description,
vpc_id,
subnet_id,
的地位,
地区)
“备份VPC”;
“VPC用于数据备份和恢复”;
“vpc - 456789”,
“子网- 567890”,
“活跃”,
“一来”);
在前面的插入语句示例中,我们确保不包含ID列的值。否则将导致数据库出错。
例子:
[Err] ERROR: cannot insert into column " id"
列" id "是一个标识列,定义为" GENERATED ALWAYS "。
这是因为GENERATED ALWAYS不允许我们手动指定值。
例2:默认生成
使用generate BY DEFAULT子句定义标识列允许我们手动插入或更新列的值。
删除vpc_mapping表
创建表vpc_mapping
id INT默认生成的身份,
vpc_name VARCHAR (255),
mapping_description文本,
vpc_id VARCHAR (50),
subnet_id VARCHAR (50),
状态VARCHAR(20)不空,
地区VARCHAR (50),
主键(id)
);
创建后,可以按如下方式指定列的值:
插入
成
vpc_mapping (id、
vpc_name,
mapping_description,
vpc_id,
subnet_id,
的地位,
地区)
1、“生产VPC”;
“生产环境的主VPC”,
“vpc - 123456”,
“子网- 789012”,
“活跃”,
“us-east-1”);
如您所见,我们指定了ID列的值而没有出现错误。
结论
在本教程中,我们学习了SQL中的标识列。我们学习了它们是什么,它们的特点,它们是如何工作的,以及如何在SQL数据库中使用它们。最好参考您的引擎的文档,以了解有关标识列的更多信息。例如:在PostgreSQL中,检查SERIAL, MySQL,检查AUTO_INCREMENT, SQL Server, AUTO INCREMENT。