热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql插入删除_我的MYSQL学习心得(八)插入更新删除

这一篇《我的MYSQL学习心得(八)》将会讲解MYSQL的插入、更新和删除语句同样的,只会讲解跟SQLSERVER不同的地方插入将多行查询结果插入到表中语法INSER

这一篇《我的MYSQL学习心得(八)》将会讲解MYSQL的插入、更新和删除语句

同样的,只会讲解跟SQLSERVER不同的地方

插入

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

语法

INSERT INTO table_name1(column_list1) SELECT (column_list2) FROM table_name2 WHERE (condition)

INSERT INTO SELECT 在SQLSERVER里也是支持的

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

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

condition指定SELECT语句的查询条件

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

CREATE TABLE person (

id INT UNSIGNED NOT NULL AUTO_INCREMENT,

NAME CHAR(40) NOT NULL DEFAULT '',

age INT NOT NULL DEFAULT 0,

info CHAR(50) NULL,

PRIMARY KEY (id)

)

CREATE TABLE person_old (

id INT UNSIGNED NOT NULL AUTO_INCREMENT,

NAME CHAR(40) NOT NULL DEFAULT '',

age INT NOT NULL DEFAULT 0,

info CHAR(50) NULL,

PRIMARY KEY (id)

)

INSERT INTO person_old

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

SELECT * FROM person_old

48304ba5e6f9fe08f3fa1abda7d326ab.png

64926ea2efe3f0f81fd69cebd43a529e.png

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

INSERT INTO person(id,NAME,age,info)

SELECT id,NAME,age,info FROM person_old;

SELECT * FROM person

21a6f12860568eb5dff381ac300df743.png

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

只插入其他字段的值

如果再执行一次就会出错

82e8dd0776518900552cfb5109c30295.png

MYSQL和SQLSERVER的区别:

区别一

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

方案一:使用 ignore 关键字

方案二:使用 replace into   mysql4.1之前只有replace into

方案三:ON DUPLICATE KEY UPDATE    mysql4.1之后引入on duplicate key update  替代replace into

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

TRUNCATE TABLE person

TRUNCATE TABLE persona_old

INSERT INTO person_old

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

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

INSERT INTO person(id,NAME,age,info)

SELECT id,NAME,age,info FROM person_old;

INSERT INTO person_old

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

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

INSERT IGNORE INTO person(id,NAME,age,info)

SELECT id,NAME,age,info FROM person_old;

48304ba5e6f9fe08f3fa1abda7d326ab.png

6af491f92df1ff078a5dc057defa5877.png

757e82ed616247d90335b9aecbbcb96b.png

可以看到插入成功

SQLSERVER

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

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

区别二

插入自增列时的区别

SQLSERVER需要使用 SET IDENTITY_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')

7deed3213f4cc5cd6ef48d19a6f3aaa9.png

也可以指定值

INSERT IGNORE INTO person(id,NAME,age,info) VALUES (16,'tom',88,'student')

93f0a90ab0787051a26d35fa41fc2beb.png

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

INSERT IGNORE INTO person(NAME,age,info) VALUES ('amy',12,'bb')

4c6117528195224ebcf44333a119acad.png

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

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

区别三

唯一索引的NULL值重复问题

MYSQL

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

insert into test(a) values(null)

insert into test(a) values(null)

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

SQLSERVER

SQLSERVER则不行

48304ba5e6f9fe08f3fa1abda7d326ab.png

CREATE TABLE person (

id INT NOT NULL IDENTITY(1,1),

NAME CHAR(40) NULL DEFAULT '',

age INT NOT NULL DEFAULT 0,

info CHAR(50) NULL,

PRIMARY KEY (id)

)

CREATE UNIQUE INDEX IX_person_unique ON [dbo].[person](name)

INSERT INTO [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)

)

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

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

语句已终止。

增强的values子句

sqlserver  增强的values子句

48304ba5e6f9fe08f3fa1abda7d326ab.png

http://www.cnblogs.com/lyhabc/articles/3960374.html

INSERT INTO [dbo].[counttb]

( [id] ,

[TESTDATE]

)

VALUES ( ( SELECT a

FROM [dbo].[aaa]

WHERE [a] = 2

) , -- id - int

GETDATE() -- TESTDATE - datetime

)

48304ba5e6f9fe08f3fa1abda7d326ab.png

mysql  子查询

48304ba5e6f9fe08f3fa1abda7d326ab.png

INSERT INTO test

( NAME ,

dd

)

VALUES ( ( SELECT NAME

FROM test1

WHERE id = 2

) , -- id - int

NOW()

)

SELECT * FROM test

SELECT * FROM test1

SQL 学习指南P172

48304ba5e6f9fe08f3fa1abda7d326ab.png

更新

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

UPDATE person SET info ='police' WHERE id BETWEEN 14 AND 17

SELECT * FROM person

ceb4088ab51f7af448a956f6e0b729fb.png

多表update

UPDATE BOOK,BOOK2 SET BOOK.`bookcount`=2 ,BOOK2.`bookcount`=3

WHERE BOOK.`bookid`=1 AND BOOK2.`bookid`=1;

按排序更新

update book

set bookcount=2

where bookname in ('ss')

order by bookid

limit 10

删除

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

DELETE FROM person WHERE id BETWEEN 14 AND 17

SELECT * FROM person

4019348f571502bbb04fbd57fc41bff9.png

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

##方法一

DELETE FROM person

##方法二

TRUNCATE TABLE person

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

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

79a7f67c58007c1fd72beebf1a5795f2.png

3af6fc6becc0ed817a6624fc48ffdb62.png

89aeff54256d97456583e49f8e86b5d1.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

INSERT IGNORE INTO person(id,NAME,age,info)

SELECT id,NAME,age,info FROM person_old;

SELECT * FROM person

TRUNCATE TABLE person

INSERT IGNORE INTO person(NAME,age,info) VALUES ('amy',12,'bb')

SELECT * FROM person

48304ba5e6f9fe08f3fa1abda7d326ab.png

01a702afd28c2dd0601b1169d7018fec.png

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

SHOW TABLE STATUS LIKE 'person'

97d73f453822f73cdb8a9a6da368e2ba.png

按排序删除

delete from book

order by bookcount desc

limit 50

多表delete SQL学习指南 P268

DELETE book ,book2 FROM book ,book2

WHERE book.`bookid` >1 AND book2.`bookid`>1

如果是innodb引擎,并且有外键约束,将不能使用多表delete/update,因为innodb引擎不保证数据修改不破坏约束的执行顺序

总结

这一节介绍了MYSQL里的的插入、更新和删除,并且比较了与SQLSERVER的区别,特别是MYSQL里插入语句的灵活性

刚刚开始从SQLSERVER转过来可能会有一些不适应



推荐阅读
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • h5调用本地摄像头和麦克风一
    h5调用本地摄像头和麦克风一,Go语言社区,Golang程序员人脉社 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 周排行与月排行榜开发总结
    本文详细介绍了如何在PHP中实现周排行和月排行榜的开发,包括数据库设计、数据记录和查询方法。涉及的知识点包括MySQL的GROUP BY、WEEK和MONTH函数。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • 事件是程序各部分之间的一种通信方式,也是异步编程的一种实现形式。本文将详细介绍EventTarget接口及其相关方法,以及如何使用监听函数处理事件。 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
author-avatar
mobiledu2502918245
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有