mysql 插入 删除优化_MySQL优化之——插入 更新 删除

插入

将多行查询结果插入到表中

语法

INSERTINTOtable_name1(column_list1)SELECT(column_list2)FROMtable_name2WHERE(condition)

table_name1指定待插入数据的表;column_list1指定待插入表中要插入数据的哪些列;table_name2指定插入数据是从

哪个表中查询出来的;column_list2指定数据来源表的查询列,该列表必须和column_list1列表中的字段个数相同,数据类型相同;

condition指定SELECT语句的查询条件

从person_old表中查询所有的记录,并将其插入到person表

CREATETABLEperson (

id INTUNSIGNEDNOTNULLAUTO_INCREMENT,

NAMECHAR(40)NOTNULLDEFAULT'',

age INTNOTNULLDEFAULT0,

info CHAR(50)NULL,

PRIMARYKEY(id)

)

CREATETABLEperson_old (

id INTUNSIGNEDNOTNULLAUTO_INCREMENT,

NAMECHAR(40)NOTNULLDEFAULT'',

age INTNOTNULLDEFAULT0,

info CHAR(50)NULL,

PRIMARYKEY(id)

)

INSERTINTOperson_old

VALUES(11,'Harry',20,'student'),(12,'Beckham',31,'police')

SELECT*FROMperson_old

0818b9ca8b590ca3270a3433284dd417.png

可以看到,插入记录成功,person_old表现在有两条记录。接下来将person_oldperson_old表中的所有记录插入到person表

INSERTINTOperson(id,NAME,age,info)

SELECTid,NAME,age,infoFROMperson_old;

SELECT*FROMperson

0818b9ca8b590ca3270a3433284dd417.png

可以看到数据转移成功,这里的id字段为自增的主键,在插入时要保证该字段值的唯一性,如果不能确定,可以插入的时候忽略该字段,

只插入其他字段的值

如果再执行一次就会出错

0818b9ca8b590ca3270a3433284dd417.png

MYSQL和SQLSERVER的区别:

区别一

当要导入的数据中有重复值的时候,MYSQL会有三种方案

方案一:使用 ignore 关键字

方案二:使用 replace into

方案三:ON DUPLICATE KEY UPDATE

第二和第三种方案这里不作介绍,因为比较复杂,而且不符合要求,这里只讲第一种方案

TRUNCATETABLEperson

TRUNCATETABLEpersona_old

INSERTINTOperson_old

VALUES(11,'Harry',20,'student'),(12,'Beckham',31,'police')

##注意下面这条insert语句是没有ignore关键字的

INSERTINTOperson(id,NAME,age,info)

SELECTid,NAME,age,infoFROMperson_old;

INSERTINTOperson_old

VALUES(13,'kay',26,'student')

##注意下面这条insert语句是有ignore关键字的

INSERTIGNOREINTOperson(id,NAME,age,info)

SELECTid,NAME,age,infoFROMperson_old;

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

可以看到插入成功

SQLSERVER

在SQLSERVER这边,如果要忽略重复键,需要在建表的时候指定 WITH (IGNORE_DUP_KEY= ON) ON[PRIMARY]

这样在插入重复值的时候,SQLSERVER第一次会保留值,第二次发现有重复值的时候,SQLSERVER就会忽略掉

区别二

插入自增列时的区别

SQLSERVER需要使用 SETIDENTITY_INSERT 表名 ON 才能把自增字段的值插入到表中,如果不加 SET IDENTITY_INSERT 表名 ON

则在插入数据到表中时,不能指定自增字段的值,则id字段不能指定值,SQLSERVER会自动帮你自动增加一

INSERTINTO person(NAME,age,info)VALUES('feicy',33,'student')

而MYSQL则不需要,而且自由度非常大

你可以将id字段的值指定为NULL,MYSQL会自动帮你增一

INSERTINTO person(id,NAME,age,info)VALUES(NULL,'feicy',33,'student')

0818b9ca8b590ca3270a3433284dd417.png

也可以指定值

INSERTIGNOREINTOperson(id,NAME,age,info)VALUES(16,'tom',88,'student')

0818b9ca8b590ca3270a3433284dd417.png

也可以不写id的值,MYSQL会自动帮你增一

INSERTIGNOREINTOperson(NAME,age,info)VALUES('amy',12,'bb')

0818b9ca8b590ca3270a3433284dd417.png

你可以指定id字段的值也可以不指定,指定的时候只要当前id字段列没有你正在插入的那个值就可以,即没有重复值就可以

自由度非常大,而且无须指定 SET IDENTITY_INSERT 表名 ON 选项

区别三

唯一索引的NULL值重复问题

MYSQL

在MYSQL中UNIQUE 索引将会对null字段失效

insertintotest(a)values(null)

insertintotest(a)values(null)

上面的插入语句是可以重复插入的(联合唯一索引也一样)

SQLSERVER

SQLSERVER则不行

CREATETABLEperson (

id INTNOTNULLIDENTITY(1,1),

NAMECHAR(40)NULLDEFAULT'',

age INTNOTNULLDEFAULT0,

info CHAR(50)NULL,

PRIMARYKEY(id)

)

CREATEUNIQUEINDEXIX_person_uniqueON[dbo].[person](name)

INSERTINTO[dbo].[person]

( [NAME], [age], [info] )

VALUES(NULL,-- NAME - char(40)

1, -- age - int

'aa'-- info - char(50)

),

( NULL,-- NAME - char(40)

2, -- age - int

'bb'-- info - char(50)

)

消息 2601,级别 14,状态 1,第 1行

不能在具有唯一索引“IX_person_unique”的对象“dbo.person”中插入重复键的行。重复键值为 ()。

语句已终止。

更新

更新比较简单,就不多说了

UPDATEpersonSETinfo ='police'WHEREidBETWEEN14AND17

SELECT*FROMperson

0818b9ca8b590ca3270a3433284dd417.png

删除

删除person表中一定范围的数据

DELETEFROMpersonWHEREidBETWEEN14AND17

SELECT*FROMperson

0818b9ca8b590ca3270a3433284dd417.png

如果要删除表的所有记录可以使用下面的两种方法

##方法一

DELETEFROMperson

##方法二

TRUNCATETABLEperson

跟SQLSERVER一样,TRUNCATE TABLE会比DELETE FROM TABLE 快

MYISAM引擎下的测试结果,30行记录

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

跟SQLSERVER一样,执行完TRUNCATE TABLE后,自增字段重新从一开始。

################################

INSERTIGNOREINTOperson(id,NAME,age,info)

SELECTid,NAME,age,infoFROMperson_old;

SELECT*FROMperson

TRUNCATETABLEperson

INSERTIGNOREINTOperson(NAME,age,info)VALUES('amy',12,'bb')

SELECT*FROMperson

0818b9ca8b590ca3270a3433284dd417.png

当你刚刚truncate了表之后执行下面语句就会看到重新从一开始

SHOWTABLESTATUSLIKE'person'

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值