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

2022-10-23 13:49:21

from test9_DB import users,engine#插入ins = users.insert().values(name='jack', age= 20)conn = engine.connect()conn.execute(ins)conn.execute(users.insert(), [ # doctest: +ELLIPSIS{'name': 'wendy', 'age' : 11},{'name': 'michael', 'ag

插入将多行查询结果插入到表中语法[sql] view plaincopyINSERT 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表[sql] view plaincopyCREATE 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

可以看到,插入记录成功,person_old表现在有两条记录。接下来将person_oldperson_old表中的所有记录插入到person表[sql] view plaincopyINSERT 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第二和第三种方案这里不作介绍,因为比较复杂,而且不符合要求,这里只讲第一种方案[sql] view plaincopyTRUNCATE 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;

可以看到插入成功SQLSERVER在SQLSERVER这边,如果要忽略重复键,需要在建表的时候指定 WITH (IGNORE_DUP_KEY= ON) ON[PRIMARY] 这样在插入重复值的时候,SQLSERVER第一次会保留值,第二次发现有重复值的时候,SQLSERVER就会忽略掉区别二插入自增列时的区别SQLSERVER需要使用 SETIDENTITY_INSERT 表名 ON 才能把自增字段的值插入到表中,如果不加 SET IDENTITY_INSERT 表名 ON 则在插入数据到表中时,不能指定自增字段的值,则id字段不能指定值,SQLSERVER会自动帮你自动增加一[sql] view plaincopyINSERTINTO person(NAME,age,info) VALUES ('feicy',33,'student')

而MYSQ4.2

Hibernate的批量处理 Hibernate完全以面向对象的方式来操作 数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作。例如调用Session的delete()方法来删除持久化对象,Hibernate将负责删除对应的数据记录;当执行持久化对象L则不需要,而且自由度非常大你可以将id字段的值指定为NULL,MYSQL会自动帮你增一[sql] view plaincopyINSERTINTO person(id,NAME,age,info) VALUES (NULL,'feicy',33,'student')

也可以指定值[sql] view plaincopyINSERT IGNORE INTO person(id,NAME,age,info) VALUES (16,'tom',88,'student')

也可以不写id的值,MYSQL会自动帮你增一[sql] view plaincopyINSERT IGNORE INTO person(NAME,age,info) VALUES ('amy',12,'bb')

你可以指定id字段的值也可以不指定,指定的时候只要当前id字段列没有你正在插入的那个值就可以,即没有重复值就可以自由度非常大,而且无须指定 SET IDENTITY_INSERT 表名 ON 选项区别三唯一索引的NULL值重复问题MYSQL在MYSQL中UNIQUE 索引将会对null字段失效[sql] view plaincopyinsert into test(a) values(null)

insert into test(a) values(null)

上面的插入语句是可以重复插入的(联合唯一索引也一样)SQLSERVERSQLSERVER则不行[sql] view plaincopyCREATE 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)

)

消息 2601,级别 14,状态 1,第 1 行不能在具有唯一索引“IX_person_unique”的对象“dbo.person”中插入重复键的行。重复键值为 ()。语句已终止。 更新更新比较简单,就不多说了[sql] view plaincopyUPDATE person SET info ='police' WHERE id BETWEEN 14 AND 17

SELECT * FROM person

删除删除person表中一定范围的数据[sql] view plaincopyDELETE FROM

person

WHERE id BETWEEN 14 AND 17

SELECT * FROM person

如果要删除表的所有记录可以使用下面的两种方法[sql] view plaincopy##方法一

DELETE

FROM person

##方法二

TRUNCATE TABLE

person

跟SQLSERVER一样,TRUNCATE TABLE会比DELETE FROM TABLE 快MYISAM引擎下的测试结果,30行记录

跟SQLSERVER一样,执行完TRUNCATE TABLE后,自增字段重新从一开始。[sql] view plaincopy################################

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

当你刚刚truncate了表之后执行下面语句就会看到重新从一开始[sql] view plaincopySHOW TABLE STATUS LIKE 'person'

  • 作者:叶银瑶
  • 原文链接:https://blog.csdn.net/weixin_36474955/article/details/114334575
    更新时间:2022-10-23 13:49:21