与MSSQL对比学习MYSQL的心得(八)--插入 更新 删除,mssqlmysql
同样的,只会讲解跟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表
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

可以看到,插入记录成功,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,'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需要使用 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')

也可以指定值
INSERT IGNORE INTO person(id,NAME,age,info) VALUES (16,'tom',88,'student')

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

你可以指定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 '',
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”中插入重复键的行。重复键值为 (<NULL>)。 语句已终止。
更新
更新比较简单,就不多说了
UPDATE person SET info ='police' 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 ('amy',12,'bb')
SELECT * FROM person

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

总结
这一节介绍了MYSQL里的的插入、更新和删除,并且比较了与SQLSERVER的区别,特别是MYSQL里插入语句的灵活性
刚刚开始从SQLSERVER转过来可能会有一些不适应
如有不对的地方,欢迎大家拍砖o(∩_∩)o
mssql和mysql的区别
mssql 是微软的那个 SQL Server,运行于windows 2000,2003等平台
mysql 是个开源的数据库Server,可运行在windows平台、unix\\linux平台,其标准版是免费的,可以到www.mysql.com 看看
asp\\php只是一种解释语言,不一定mssql不能用php,也不一定mysql非得用php,只不过asp-mssql,php-mysql是一种常用的组合
SQL数据库完全手册_1
SQL是Structured Quevy Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
##1 二、SQL数据库数据体系结构
SQL数据库的数据体系结构基本上是***结构,但使用术语与传统关系模型术语不同。在SQL中,关系模式(模式)称为“基本表”(base table);存储模式(内模式)称为“存储文件”(stored file);子模式(外模式)称为“视图”(view);元组称为“行”(row);属性称为“列”(column)。名称对称如^00100009a^:
##1 三、SQL语言的组成
在正式学习SQL语言之前,首先让我们对SQL语言有一个基本认识,介绍一下SQL语言的组成:
1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义。
2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项。
3.一个表或者是一个基本表或者是一个视图。基本表是实际存储在数据库的表,而视图是由若干基本表或其他视图构成的表的定义。
4.一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。每个存储文件与外部存储上一个物理文件对应。
5.用户可以用SQL语句对视图和基本表进行查询等操作。在用户角度来看,视图和基本表是一样的,没有区别,都是关系(表格)。
6.SQL用户可以是应用程序,也可以是终端用户。SQL语句可嵌入在宿主语言的程序中使用,宿主语言有FORTRAN,COBOL,PASCAL,PL/I,C和Ada语言等。SQL用户也能作为独立的用户接口,供交互环境下的终端用户使用。
##1 四、对数据库进行操作
SQL包括了所有对数据库的操作,主要是由4个部分组成:
1.数据定义:这一部分又称为“SQL DDL”,定义数据库的逻辑结构,包括定义数据库、基本表、视图和索引4部分。
2.数据操纵:这一部分又称为“SQL DML”,其中包括数据查询和数据更新两大类操作,其中数据更新又包括插入、删除和更新三种操作。
3.数据控制:对用户访问数据的控制有基本表和视图的授权、完整性规则的描述,事务控制语句等。
4.嵌入式SQL语言的使用规定:规定SQL语句在宿主语言的程序中使用的规则。
下面我们将分别介绍:
##2 (一)数据定义
SQL数据定义功能包括定义数据库、基本......余下全文>>
还是更新好一些,每删除再插入,主键就会增加一个数字,而且删除和插入,是要对数据库做两次操作,而update只做一次