热门标签 | 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转过来可能会有一些不适应



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
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社区 版权所有