无法更新标识列 id。_MySQL|辅助列和虚拟列的应用

在导入数据时遇到主键确定难题,通过添加辅助列(日期&ID)来解决。介绍如何在MySQL中添加、删除和修改列,以及如何利用虚拟列创建主键和解决面试题中的折扣计算问题。虚拟列节省存储空间,只在读取时计算结果。
摘要由CSDN通过智能技术生成

86040206a3561da261447e6030e4f5c6.png

在导入数据时,会发现无法确定主键的情况:

3c0c9cf92e36df28a9497b840d922de4.png

分表会太麻烦,那就直接加一列辅助列吧——日期&ID,那如何用SQL在表中加一个新列?我们先看一些基本操作:

  • 在一个新建好的表中添加一列,这一列默认添加在表的最后一列
alter table <表名> add column <列名> varchar(20) not null;
  • 如果想指定列的位置
 alter table <表名> add column <列名> varchar(20) not null after <列名>;
  • 如果想放到第一列
 alter table <表名> add column <列名> varchar(20) not null first;
  • 再讲几个删改列的代码
 alter table <表名> change <修改前的列名> <修改后的列名> char;
 alter table <表名> drop column <列名>;
  • 更新某列数值
UPDATE <表名> set <某列名>=CONCAT(<列名1>,<列名2>);
  • 更改某列顺序
alter table <表名> modify <列名1> varchar(10) after <列名2>;

回到上面图中的问题,当日期列中有重复日期,ID列中有重复ID,这时候想要一个主键列怎么办?很简单,把日期和ID两列拼接成新列就行了:

ALTER TABLE `底表` ADD COLUMN `主键` VARCHAR(80) not NULL FIRST;
UPDATE `底表` set `主键`=CONCAT(`日期`,`现在在使用的ID`);
alter table `底表` modify `日期` varchar(10) after `主键`;

不过主键列并未出现在第一列,其实列多了,谁在前谁在后就不那么重要了……

接下来举个网上看到的面试题吧,需要用到虚拟列

b080af831133e2c68173dddb7173233e.png

有这么一张表,其中DISCOUNT表示折扣,-1代表不打折,88表示88折,现在要求加一列,显示折扣后的单价。

按照上面的方法修改表添加列再更新数据是行得通,但这可是面试题,要是不出彩怎么能行?

小伙伴们可知道虚拟生成列?

ALTER TABLE sheet1 ADD discount_price DECIMAL(9,2) as (IF(DISCOUNT!=-1,PRICE*DISCOUNT/100,PRICE)) VIRTUAL;

a92e04f80bd91bb8bdf12a44e099c15b.png

插入新数据后:

INSERT INTO sheet1(ID,PRODUCT,PRICE,DISCOUNT) VALUES ('6','66',1597,94);

36936c75f4414d7380639143879c1eea.png

discount_price会自动计算了。

代码末尾有个VIRTUAL,这个VIRTUAL表示这个类型的列会在读取表记录时自动计算此列的结果并返回;

相对应有STORED,表示存储,这个类型的列会在表中插入一条数据时自动计算对应的值,并插入到这个列中,那么这个列会作为一个常规列存在表中。

虚拟列的好处在于它不会占用存储空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值