sql insert时自动赋上默认值_SQL之朝花夕拾(一)

4350927cc19ff7ecb932893801db26dd.png

旧事重提,温故知新。

除去我们在初级和中阶里最常用的SELECT(检索),SQL还有三个经常使用的语句需要重点学习:

  • INSERT(插入);
  • UPDATE(更新);
  • DELETE(删除)。

今天,我们将重点解析INSERT(插入)的用法。

重温INSERT

INSERT(插入)是用来插入/添加行到数据库表的。利用INSERT我们可以插入如下数:

  • 完整的行;
  • 行的一部分;
  • 多个不同的行;
  • 查询/计算的结果。

我们在之前曾反复练习过针对完整行和多行的练习(动辄建个表~),但其实INSERT中可以涵盖的内容有很多。

普通INSERT举例

再次借用一下之前的扫地僧,不对,公司职员薪资表:

03f40d543e68b2504aeeb01e1d46d491.png

先来建个职员表的框架:

CREATE TABLE 职员 (编号 INT, 姓名 CHAR(100), 电话 INT, 职位编号 INT);

假如我们想在职员表中插入相应信息,我们之前是这样做的:

INSERT INTO 职员 
VALUE (1, '张三', 1638264, 2);

4117cebbf861230b2b988d16fce9ee60.png

注意:使用CREATE和INSERT通常不会产生输出,若是想要查看列表,需使用SELECT(检索)或SHOW(显示)语句(SHOW语句会在以后的文章中介绍)。

但这样简单输入信息会有隐患:因为它高度依赖于表中列的定义次序,如果我们输入的信息并没有根据在框架中的顺序,或者在未来框架中列的位置发生了变化,我们的INSERT语句便会产生错误。

因此,在INSERT语句中,虽然烦琐但是更为安全的做法是在INSERT INTO中定义信息的次序:

INSERT INTO 职员(编号, 姓名, 电话, 职位编号)
VALUE (1, '张三', 1638264, 2);

4117cebbf861230b2b988d16fce9ee60.png

上面两个SQL语句所完成的工作完全相同,但因为第二个例子中我们明确定义了列中的次序,便不必担心日后表的结构改变了。

若是我们有缺失的数值,也可以通过这种方法来处理。假如我们并不知道该职员的电话:

CREATE TABLE 职员 (编号 INT, 姓名 CHAR(100), 电话 INT, 职位编号 INT);
INSERT INTO 职员(编号, 姓名, 职位编号)
VALUE (1, '张三', 2);

1f73afa650cd2c1bb0d907a5b28d9004.png

这里我们在定义列的次序时便没有输入电话,但由于表的结构中有电话的列存在,且我们并没有在表定义中设置默认值,因此,在返回中,张三的电话显示为NULL(空值)。

顺带一提,当数据库被多个客户同时访问时,MySQL可以自动处理运行请求和管理运行次序。然而INSERT的操作可能很耗时,特别是有很多索引需要更新时,所以它可能会降低等待处理的SELECT语句的性能。

因此,如果我们想确保先处理SELECT语句时,我们可以对INSERT的运行“降级(low priority)”:

#原本的INSERT语句:
INSERT INTO TABLE 表 VALUE(值1, 值2,值3, ...)
#降级INSERT的运行顺序:
INSERT LOW_PRIORITY INTO TABLE 表 VALUE(值1, 值2,值3, ...)

对于多行数值同时输入的用法可以在《SQL之突然入门》中找到。

补充一点,MySQL处理单条INSERT语句多个插入比使用多条INSERT语句快。

合而为一

有些时候我们可能会想在表格中插入检索出的列。

比如我们有两张单价和数量的销售表。

方便起见,金额这里全部设置成了整数。

旧表:

CREATE TABLE 销售(ID INT, 单价 INT, 数量 INT);
INSERT INTO 销售(ID, 单价, 数量) 
VALUE(1, 32, 4), (2, 46, 8), (3, 29, 5);

6fda0b7da5d53868e1ca5d392bb493ea.png

这张是新表:

CREATE TABLE 新销售(ID INT, 单价 INT, 数量 INT, 总计 INT);
INSERT INTO 新销售(ID, 单价, 数量, 总计) 
VALUE(5, 8, 30, 240), (53, 2, 7, 14), (25, 4, 9, 36);

e9d2d234e80e30e6fe077cc5b6a1e20a.png

我们可以看到,在旧的销售表中,并不存在总计的栏目。假如我们想将两张表合并,即,将旧表中的值导入至新表中,我们可以直接在INSERT中执行运算:

INSERT INTO 新销售(ID, 单价, 数量, 总计) 
SELECT ID, 单价, 数量, 单价*数量 
FROM 销售;

b5865c6036a35d70c351919ef4c77d53.png

这里要注意的是,如果在旧表和新表中都用了ID作为主键,且两者中出现了重复数值的话,INSERT将会失败(主键只能取唯一值)

以上的例子中,我们在INSERT与SELECT语句中都取了相同的列名,但实际中并不一定需要列名匹配。

小结

今天我们学习了使用INSERT的几种方法,以及为什么要指定列名,并学习了如何用INSERT...SELECT...FROM...从其他表中导入行。


希望大家看了今天的内容后能更进一步地了解INSERT语句,如果还是有什么疑问或是建议的话,欢迎留言询问~

祝各位学习愉快!

#这里是画风逐渐飘逸【不】的正经(?)学习公众号:

af9485ce25c9f89a4a447df126df5be7.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值