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

这一篇《我的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转过来可能会有一些不适应

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值