在平时对数据库操作时,有时候需要向数据库中插入一些数据,此时就需要使用数据库的插入语句,但是在向数据中库插入数据时,不能盲目插入,因为盲目的插入可能会造成数据重复,浪费数据库的资源,所以一般情况下数据库中都会有所谓的主键,要求被选用的主键字段或者组合不能重复,这样可以避免一些脏数据的产生,但是同时又带来了一些不友好的操作,比如当在插入某条数据时,主键字段的值已经存在了,此时如果直接使用insert into语句进行插入时,则会报错,提示该字段的值已经存在,但是有时候我们并不希望看到语句报错,所以这就带来了一些不好的操作体验,为了避免这种报错的产生,最好的方式就是在插入的时候避免主键重复。如果实在避免不了。使用如下几种语法,同样可以达到不报错的效果。
语法 | 备注(存在主键) |
---|---|
insert ignore into | 若在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。 |
insert into not exists | 若在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。 |
insert into on duplicate key update | 若在数据库已经存在,则先更新,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。 |
replace into | 若在数据库已经存在,则直接删除,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。 |
测试数据库
-- auto-generated definition
create table if not exists t_admin
(
id int auto_increment
primary key,
adminName varchar(50) null,
passWord varchar(50) null
);
INSERT INTO t_admin (id, adminName, passWord) VALUES (1, 'admin', 'admin');
INSERT INTO t_admin (id, adminName, passWord) VALUES (2, 'xiaoqian', '123456');
解释:
存在主键, 若插入的数据主键值在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
insert ignore into t_admin value (2,'itbestboy','123456');
可以看出,此时插入没有成功,因为主键值已经存在,忽略了此次插入操作,但是也没有报错,提高了友好度,如果按着平时的操作是肯定会报错的。
报错
解释:
存在主键, 若插入的数据主键值在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
insert into t_admin select 2,'itbestboy','123456' from t_admin where not exists(select id from t_admin where id=2);
可以看出,此时插入没有成功,因为主键值已经存在,忽略了此次插入操作,但是也没有报错,提高了友好度.
解释:
存在主键, 若插入的数据主键值在数据库已经存在,则先更新,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中,此操作类似更新语句。
-- 主键值在数据库中已经存在,此时会先执行update 语句,然后在插入,
insert into t_admin value (2,'itbestboy','123456') on duplicate key update adminName='itbestboy', passWord='123456';
-- 注;当update语句后跟的值与value中的值不一致时,会按着update语句后的值进行入库操作。
若主键值在数据库中不存在,则会直接插入,update语句失效
insert into t_admin value (3,'itbestboy','123456') on duplicate key update adminName='tboy', passWord='1456';
存在主键, 若插入的数据主键值在数据库已经存在,则先删除,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中,此操作类似更新语句。
-- 主键值在数据库中已经存在,此时会先删除这条记录,然后重新插入数据库中
replace into t_admin (id, adminName, passWord) VALUES (3, 'boy', '123456');
若主键值在数据库中不存在,则会直接插入,删除语句失效
insert into t_admin value (3,'itbestboy','123456') on duplicate key update adminName='tboy', passWord='1456';
虽然上述方法可以避免主键值重复时插入报错,但是有时候,我们就需要看到相应的报错信息,才会更加有利于调试,所以至于怎么使用何时使用需要视情况而定。