前面学习记录的都是查询数据,那些也是SQL中最常用的语句,这篇我们来学习和积累一下相数据库中插入数据的SQL。
另外,需要注意的是,很多数据库对查询操作要求的权限可能低一些,但是对于插入、修改、删除等操作都需要较高的权限。
INSERT INTO 语句
1、插入完整的行
例如我们需要插入一条新的订单记录可以这样写:
-
写法 一 :
无需指定要插入数据的列名,只需提供被插入的值即可。
SQL格式INSERT INTO table_name VALUES (value1,value2,value3,...)
insert into oderlist_new
VALUES (19,'圣女果',10,10.0,'20181021001',32,'吴语','2018-10-21 2:25:55',3)
执行结果
SQL说明:
上面的 SQL语句高度依赖于表中列的定义次序,如果表结构发生改变时这样写是不安全的,所以虽然这种语法很简单,但应该尽量避免使用。那么我们该怎么写呢?来看第二种写法
-
写法 二:
需要指定列名及被插入的值
SQL格式INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...)
insert into oderlist_new (id,goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
VALUES (20,'圣女果',10,10.0,'20181021002',32,'吴语','2018-10-21 22:28:55',3)
执行结果
SQL说明:
上面的SQL语句,在表名后的括号里 明确给出了列名,在插入的时候,DBMS 会将 VALUES 列表中的相应值填 入列表中的对应项。
因为提供了列名,VALUES 必须以其指定的次序匹配指定的列名,所以即使表的结构改变,这条 INSERT 语句仍然能正确工作。
2、插入部分行
使用上面的第二种写法,我们也可以进行部分数据的插入,比如,我们只需要插入订单表中的部分数据(商品名、数量、单价),我们可以这样写
insert into oderlist_new (goodsName,quantity,item_price)
VALUES ('圣女果',10,10.0)
执行结果
插入的数据
SQL说明:
可以看到,我们这里省略其他字段的插入值,在数据表中都用NULL进行了填充。
省略的列 必须满足以下某个条件。
1、该列定义为允许 NULL 值(无值或空值)。
2、在表定义中给出默认值也可以。这表示如果不给出值,将使用默认值。
如果某些列以上两个条件都不满足,那我们将其省略的时候,插入就会报错,比如我们将订单号orderNo设定为非空且无默认值的列,再执行上述插入语句
设定为非空 执行结果
我们看到插入失败了!
INSERT INTO SELECT 语句
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。SQL格式
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
3、插入检索出的数据
有时候我们需要将某个 SELECT 语句查询出来的结果插入表中,这就是所谓的 INSERT SELECT,它是由一条 INSERT 语句和一条 SELECT 语句组成的。
例如,我们进行了数据库升级需要将老的订单表中的数据(包含订单信息和供应商信息)插入到新的订单表和供应商表中,我们可以这样写
老的订单表 供应商表已有的数据 新的订单表
-
将老订单表中的供应商信息分离出来并插入到供应商表中,同一供应商存储一条记录
我们直接这样执行的话,会有重复的供应商信息存储到供应商表中
INSERT INTO supplier_new
(supplier,supplierAddress,supplierTel,supplierEmail,supplierContact)
SELECT supplier,supplierAddress,supplierTel,supplierEmail,supplierContact
FROM oderlist;
执行结果
我们插入了18条相同的供应商信息到供应商表格中
重复插入的数据
像这种没有唯一标识情况,我们怎么对其进行分组,并防止重复插入呢?
既然不能根据单一字段值进行唯一性判断,我们就取多个字段进行分组判断(这里,我取了供应商的所有相关字段进行唯一性判断,当然实际使用中可以更具实际情况来,比如有的数据中可能只需要更具供应商的名称就可以进行唯一性判断),我们调整一下SQL的写法:
INSERT INTO supplier_new
(supplier,supplierAddress,supplierTel,supplierEmail,supplierContact)
SELECT supplier,supplierAddress,supplierTel,supplierEmail,supplierContact
FROM oderlist
group by supplier,supplierAddress,supplierTel,supplierEmail,supplierContact;
执行结果
我们将订单表中相同的供应商进行了分组,并且相同的供应商只插入了1条数据到供应商表格中
插入一条记录
- 将老订单表中的订单信息分离出来并插入到新的订单表中,同时关联上供应商信息
INSERT INTO oderlist_new
(goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
SELECT goodsName,quantity,item_price,orderNo,userId,userName,orderTime,4
FROM oderlist;
执行结果
我们将老订单表中的订单信息全部插入到了新的订单表中
插入18条记录
这样,我们就将老的订单表中的供应商信息进行了分离,完成数据库的升级。
补充
再代码中实际使用的时候,我们可以使用这样的SQL来获取我们插入到供应商表中的供应商id,并作为老订单表中数据插入到新订单表中时的supplierId,而不是我上面写死的4,SQL如下:
INSERT INTO oderlist_new
(goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
select
o.`goodsName` ,
o.`quantity` ,
o.`item_price` ,
o.`orderNo` ,
o.`userId` ,
o.`userName` ,
o.`orderTime` ,
(select id from supplier_new where `supplier` = o.supplier and
`supplierAddress` = o.supplierAddress and
`supplierTel` = o.supplierTel and
`supplierEmail` = o.supplierEmail and
`supplierContact`= o.supplierContact ) as `supplierId`
from oderlist o
执行结果
插入成功
将一个表中的数据复制到另一个表
比如我们修改了表的结构(比如指定了外键),现在需要把老表( oderlist_new2 )中的数据全部复制到新表( oderlist_new )中,我们可以这样写
使用SELECT INTO语句:
SELECT *
INTO 新表
FROM 旧表
- MariaDB、MySQL、Oracle、PostgreSQL和 SQLite使用的不一样
CREATE TABLE 新表
AS
SELECT * FROM 旧表
- 利用INSERT INTO SELECT实现表的复制
INSERT INTO 新表 *
SELECT *
FROM 旧表
例如,我们将表oderlist_new2 中的全部数据复制给表oderlist_new
INSERT INTO oderlist_new
(goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
SELECT o.`goodsName` ,
o.`quantity` ,
o.`item_price` ,
o.`orderNo` ,
o.`userId` ,
o.`userName` ,
o.`orderTime` ,
o.`supplierId`
from oderlist_new2 o
网友评论