SQL语法——MySQL 列生成

本文介绍了MySQL中的生成列特性,特别是虚拟列。生成列允许数据基于预定义表达式自动计算,例如在contacts表中创建了fullname列,通过CONCAT函数结合first_name和last_name。生成列分为虚拟列和存储列,虚拟列在读取时计算,而存储列在更新时计算并存储。示例中的fullname列即为虚拟列。
MySQL生成列简介

创建新表时,请在CREATE TABLE语句中指定表列。然后,可以使用INSERT,UPDATE和DELETE 语句直接修改表中的列数据。

MySQL 5.7引入了一个名为generated column 的新功能。它被称为生成列,因为此列中的数据是基于预定义的表达式或其他列计算的。

例如,具有contacts以下结构:

CREATE TABLE IF NOT EXISTS contacts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
); 

要获取联系人的全名,请使用以下CONCAT()函数:

SELECT 
    id, CONCAT(first_name, ' ', last_name), email
FROM
    contacts; 

通过使用MySQL生成的列,您可以contacts按如下方式重新创建表:

DROP TABLE IF EXISTS contacts;
 
CREATE TABLE contacts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    fullname varchar(101) GENERATED ALWAYS AS (CONCAT(first_name,' ',last_name)),
    email VARCHAR(100) NOT NULL
); 

这GENERATED ALWAYS as (expression)是创建生成列的语法。

要测试fullname列,请contacts在表中插入一行。

INSERT INTO contacts(first_name,last_name, email)
VALUES('john','doe','john.doe@mysqltutorial.org'); 

可以从表中查询数据contacts。

SELECT 
    *
FROM
    contacts; 

在这里插入图片描述

当从contacts表中查询数据时,将立即计算fullname列中的值。

MySQL提供了两种类型的生成列:存储列和虚拟列。每次读取数据时都会动态计算虚拟列,而在更新数据时会物理计算和存储存储的列。

根据此定义,上例中的 fullname列是虚拟列。

MySQL生成了列的语法

定义生成列的语法如下:

column_name data_type [GENERATED ALWAYS] AS (expression)
   [VIRTUAL | STORED] [UNIQUE [KEY]] 
  1. 指定列名称及其数据类型。
  2. 添加GENERATED ALWAYS子句以指示列是生成的列。
  3. 使用相应的选项指示生成列的类型:VIRTUAL或STORED。默认情况下,如果您未明确指定生成列的类型,则使用VIRTUAL 。
  4. 在AS关键字后面的大括号内指定表达式。表达式可以包含文字,没有参数的内置函数,运算符或对同一表中任何列的引用。如果使用函数,它必须是标量和确定性的。
  5. 如果存储了生成的列,则可以为其定义 唯一约束。
### SQL Server 与 MySQL语法区别 #### 表结构修改关键词不同 在表结构调整方面,MySQL 支持 `MODIFY` 和 `CHANGE` 关键字用于更改字段属性或名称。然而,在 SQL Server 中并不存在这两个关键字,而是通过 `ALTER TABLE ... ALTER COLUMN` 来实现相同功能[^1]。 ```sql -- MySQL 修改列定义示例 ALTER TABLE table_name MODIFY column_name datatype; -- SQL Server 修改列定义示例 ALTER TABLE table_name ALTER COLUMN column_name datatype; ``` #### 批处理语句结束符的区别 对于单条命令执行完毕后的标记符号也有所差异。通常情况下,MySQL 使用分号`;`作为语句终止标志;而在 SQL Server 中,则采用 `GO` 这一特殊指令来指示一批 T-SQL 语句的结束。 ```sql -- MySQL 单条查询结束后使用分号 SELECT * FROM table_name; -- SQL Server 多条查询之间用 GO 隔开 SELECT * INTO new_table FROM old_table; GO INSERT INTO new_table SELECT * FROM another_old_table; GO ``` #### 创建带有默认值约束的表格 当创建具有默认初始值得到新表时,两者间存在细微差别——即 MySQL 不允许给定参数加上圆括号,而 SQL Server 则可以接受带括号的形式[^2]。 ```sql -- MySQL 创建含默认值字段的方式 CREATE TABLE emp10 ( name INT NOT NULL DEFAULT 12 ); -- SQL Server 创建含默认值字段的方式 CREATE TABLE emp10 ( name INT NOT NULL DEFAULT (12) ); ``` #### 数据备份导出方式的不同 关于数据库对象及其数据的整体迁移操作上也有着各自的特点。比如利用 mysqldump 工具来进行 MySQL 整库转储文件生成的操作非常便捷高效[^3]: ```bash # 导出整个OA系统的SQL脚本至本地磁盘路径下 mysqldump -h localhost -u root -p mysql oa > d:\oa.sql ``` 而对于 SQL Server 而言,虽然官方提供了多种方法完成相似的任务(如 BACKUP DATABASE),但在实际应用过程中往往更倾向于借助第三方工具或者编写 PowerShell 脚本来达成目的。 #### 检查索引是否存在前缀条件表达式的写法不一致 最后值得一提的是,在判断某个特定名字的空间内是否已经建立了相应类型的索引之前所使用的查询逻辑也不尽相同。下面展示了如何分别针对这两种 RDBMS 实现该需求的具体做法[^4]。 ```sql -- MySQL 查询sys.indexes视图检测指定表上的唯一索引情况 SHOW INDEX FROM t_person_info WHERE Key_name='idx_pCode'; -- SQL Server 查询系统目录试图确认目标表里是否有名为'idx_pCode'的非聚集索引 IF NOT EXISTS( SELECT * FROM sysindexes WHERE id = OBJECT_ID('T_Person_info') AND name = 'idx_pCode' ) BEGIN PRINT 'Index does not exist'; END; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值