在导入数据时,会发现无法确定主键的情况:
分表会太麻烦,那就直接加一列辅助列吧——日期&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 `主键`;
不过主键列并未出现在第一列,其实列多了,谁在前谁在后就不那么重要了……
接下来举个网上看到的面试题吧,需要用到虚拟列:
有这么一张表,其中DISCOUNT表示折扣,-1代表不打折,88表示88折,现在要求加一列,显示折扣后的单价。
按照上面的方法修改表添加列再更新数据是行得通,但这可是面试题,要是不出彩怎么能行?
小伙伴们可知道虚拟生成列?
ALTER TABLE sheet1 ADD discount_price DECIMAL(9,2) as (IF(DISCOUNT!=-1,PRICE*DISCOUNT/100,PRICE)) VIRTUAL;
插入新数据后:
INSERT INTO sheet1(ID,PRODUCT,PRICE,DISCOUNT) VALUES ('6','66',1597,94);
discount_price会自动计算了。
代码末尾有个VIRTUAL,这个VIRTUAL表示这个类型的列会在读取表记录时自动计算此列的结果并返回;
相对应有STORED,表示存储,这个类型的列会在表中插入一条数据时自动计算对应的值,并插入到这个列中,那么这个列会作为一个常规列存在表中。
虚拟列的好处在于它不会占用存储空间。