>데이터 베이스 >MySQL 튜토리얼 >MySQL优化之插入更新删除_MySQL

MySQL优化之插入更新删除_MySQL

WBOY
WBOY원래의
2016-06-01 13:00:01991검색

<strong style="font-family: Arial, Verdana, sans-serif;">插入</strong>

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

语法

 

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

 

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

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

condition指定SELECT语句的查询条件

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

 

CREATE TABLE person (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  NAME CHAR(40) NOT NULL DEFAULT &#39;&#39;,
  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 &#39;&#39;,
  age INT NOT NULL DEFAULT 0,
  info CHAR(50) NULL,
  PRIMARY KEY (id)
)

INSERT INTO person_old
VALUES (11,&#39;Harry&#39;,20,&#39;student&#39;),(12,&#39;Beckham&#39;,31,&#39;police&#39;)

SELECT * FROM person_old

 

\

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

 

INSERT INTO person(id,NAME,age,info)
SELECT id,NAME,age,info FROM person_old;
SELECT * FROM person 

 

\

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

只插入其他字段的值

如果再执行一次就会出错

\

 

MYSQL和SQLSERVER的区别:

区别一

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

方案一:使用 ignore 关键字
方案二:使用 replace into
方案三:ON DUPLICATE KEY UPDATE

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

 

TRUNCATE TABLE person

TRUNCATE TABLE persona_old 

INSERT INTO person_old
VALUES (11,&#39;Harry&#39;,20,&#39;student&#39;),(12,&#39;Beckham&#39;,31,&#39;police&#39;)

##注意下面这条insert语句是没有ignore关键字的
INSERT  INTO person(id,NAME,age,info)
SELECT id,NAME,age,info FROM person_old;

INSERT INTO person_old 
VALUES (13,&#39;kay&#39;,26,&#39;student&#39;)

##注意下面这条insert语句是有ignore关键字的
INSERT IGNORE INTO person(id,NAME,age,info)
SELECT id,NAME,age,info FROM person_old;

 

\

\

可以看到插入成功

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 (&#39;feicy&#39;,33,&#39;student&#39;)

 

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

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


INSERTINTO person(id,NAME,age,info) VALUES (NULL,&#39;feicy&#39;,33,&#39;student&#39;) 

\

也可以指定值

 

INSERT IGNORE INTO person(id,NAME,age,info) VALUES (16,&#39;tom&#39;,88,&#39;student&#39;)

 

\

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

 

INSERT IGNORE INTO person(NAME,age,info) VALUES (&#39;amy&#39;,12,&#39;bb&#39;)

 

\

你可以指定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则不行

 

CREATE TABLE person (
  id INT  NOT NULL IDENTITY(1,1),
  NAME CHAR(40)  NULL DEFAULT &#39;&#39;,
  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
          &#39;aa&#39;  -- info - char(50)
          ),
          ( NULL, -- NAME - char(40)
          2, -- age - int
          &#39;bb&#39;  -- info - char(50)
          )

 

消息 2601,级别 14,状态 1,第 1 行
不能在具有唯一索引&ldquo;IX_person_unique&rdquo;的对象&ldquo;dbo.person&rdquo;中插入重复键的行。重复键值为 (<null>)。
语句已终止。</null>

 


更新

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

 

UPDATE person SET info =&#39;police&#39; WHERE id BETWEEN 14 AND 17

SELECT * FROM person

 

\


删除

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

 

DELETE FROM  person  WHERE id BETWEEN 14 AND 17

SELECT * FROM person

 

\

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

 

##方法一
DELETE     FROM person

##方法二
TRUNCATE TABLE  person

 

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

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

\

\

\

 

 

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

 

################################
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 (&#39;amy&#39;,12,&#39;bb&#39;)

SELECT * FROM person

 

\

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

 

SHOW TABLE STATUS LIKE &#39;person&#39;

 

\

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.