语法的差异

我这里主要说语法的不同

1、默认约束

区别:mysql里面DEFAULT关键字后面是不用加括号的

--sqlserver

CREATE TABLE emp

(

id INT DEFAULT(12)

)

--mysql

CREATE TABLE emp

(

id INT DEFAULT 12

)

insert into emp(id) values(default);

Query OK, 1 row affected (0.05 sec)

mysql> select * from emp;

+------+

| id |

+------+

| 12 |

+------+

1 row in set (0.00 sec)

2、设置自增列

MYSQL的自增列一定要是有索引的列,设置种子值要在表的后面设置

--设置自增列

--sqlserver

CREATE TABLE emp

(

id INT IDENTITY(1, 1)

)

--mysql

-- 设置自增ID从N开始

CREATE TABLE empautoinc(

ID INT PRIMARY KEY AUTO_INCREMENT

) AUTO_INCREMENT = 100 ; --(设置自增ID从100开始)

insert into empautoinc(id) values(null);

Query OK, 1 row affected (0.00 sec)

mysql> select * from empautoinc;

+-----+

| ID |

+-----+

| 100 |

+-----+

1 row in set (0.00 sec)

show table status like 'empautoinc'\G;

*************************** 1. row ***************************

Name: empautoinc

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 1

Avg_row_length: 16384

Data_length: 16384

Max_data_length: 0

Index_length: 0

Data_free: 0

Auto_increment: 101

Create_time: 2016-06-27 11:50:32

Update_time: NULL

Check_time: NULL

Collation: utf8_general_ci

Checksum: NULL

Create_options:

Comment:

1 row in set (0.00 sec)

设置自增列的步长,可以分为全局级别和会话级别

如果是会话级别,那么当用户新建一个会话的时候,那么步长又回到了全局级别,所以mysql的步长跟sqlserver的步长有很大的不同

mysql不能设置为表级别的步长!!

mysql服务器维护着2种mysql的系统参数(系统变量):全局变量(global variables)和会话变量(session variables)。

它们的含义与区别如其各占的名称所示,session variables是在session级别的,对其的变更只会影响到本session;global variables是系统级别的,

对其的变更会影响所有新session(变更时已经存在session不受影响)至下次mysql server重启动。

注意它的变更影响不能跨重启,要想再mysql server重启时也使用新的值,那么就只有通过在命令行指定变量选项或者更改选项文件来指定,

而通过SET变更是达不到跨重启的。

每一个系统变量都有一个默认值,这个默认值是在编译mysql系统的时候确定的。

对系统变量的指定,一般可以在server启动的时候在命令行指定选项或者通过选项文件来指定

当然,大部分的系统变量,可以在系统的运行时,通过set命令指定其值。

查看系统当前默认的自增列种子值和步长值

SHOW GLOBAL VARIABLES LIKE 'auto_incre%'; -- 全局变量

问:如果有一张表,里面有个字段为id的自增主键,当已经向表里面插入了10条数据之后,删除了id为8,9,10的数据,再把mysql重启,

之后再插入一条数据,那么这条数据的id值应该是多少,是8,还是11?

答:如果表的类型为MyISAM,那么是11。如果表的类型为InnoDB,则id为8。

这是因为两种类型的存储引擎所存储的最大ID记录的方式不同,MyISAM表将最大的ID记录到了数据文件里,重启mysql自增主键的最大ID值也不会丢失;

而InnoDB则是把最大的ID值记录到了内存中,所以重启mysql或者对表进行了OPTIMIZE操作后,最大ID值将会丢失。

顺便说一下MYSQL获取当前表的自增值的四种方法

1、 SELECT MAX(id) FROM person   针对特定表

2、 SELECT LAST_INSERT_ID()  函数   针对任何表

3、 SELECT @@identity    针对任何表

@@identity 是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。

一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。

使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。

4.  SHOW TABLE STATUS LIKE 'person'

如果针对特定表,建议使用这一种方法

得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值就是当前该表的最大自增ID.

3、查看表定义

SQLSERVER

EXEC sp_help 'emp'

MYSQL

DESC emp

4、修改表名

修改表名也有差异,将表emp改为emp2

--sqlserver

EXEC sys.[sp_rename] @objname = N'emp', -- nvarchar(1035)

@newname = 'emp2' -- sysname

--mysql

ALTER TABLE emp RENAME emp2

5、修改字段的数据类型

将id字段的int类型改为bigint

--sqlserver

ALTER TABLE [dbo].[emp2] ALTER COLUMN [ID] BIGINT

--mysql

ALTER TABLE emp2 MODIFY id BIGINT

6、修改字段名

MYSQL里修改字段名的时候需要加上字段的数据类型否则会报错,而CHANGE也可以只修改数据类型,实现和MODIFY同样的效果

方法是将SQL语句中的“新字段名”和“旧字段名”设置为相同的名称,只改变“数据类型”

改变数据类型,例如刚才那个例子,将id列改为bigint数据类型

ALTER TABLE emp2 CHANGE id id BIGINT

修改字段名

--sqlserver

EXEC sys.[sp_rename] @objname = N'emp2.id', -- nvarchar(1035)

@newname = 'iid', -- sysname

@objtype = 'column' -- varchar(13)

--mysql

ALTER TABLE emp2 CHANGE id iid BIGINT

7、添加字段

添加字段的语法差不多,但是MYSQL里可以使用FIRST和AFTER关键字指定添加的字段的位置

--sqlserver

ALTER TABLE [dbo].[emp2] ADD NAME NVARCHAR(200) NULL

--mysql

ALTER TABLE emp2 ADD NAME NVARCHAR(200) NULL

8、删除字段

MYSQL删除字段不需要添加COLUMN关键字的

--sqlserver

ALTER TABLE [dbo].[emp2] DROP COLUMN NAME

--mysql

ALTER TABLE emp2 DROP NAME

9、删除外键约束

MYSQL跟SQLSERVER删除约束的方法也有很大的区别

在SQLSERVER里面,无论是唯一约束,check约束还是外键约束都可以使用下面的SQL语句来删除掉

ALTER TABLE 表名 DROP CONSTRAINT 约束名

但是MYSQL里面,如果是外键约束,需要使用 DROP FOREIGN KEY,如果是主键约束需要使用DROP PRIMARY KEY,有点麻烦

--sqlserver

ALTER TABLE dbo.emp2 DROP CONSTRAINT fk_emp_dept

--mysql

--删除外键约束

ALTER TABLE emp2 DROP FOREIGN KEY fk_emp_dept

--删除主键约束

ALTER TABLE emp2 DROP PRIMARY KEY pk_emp_dept

10、删除表

删除表的语法两个都是一样的

--sqlserver

DROP TABLE [dbo].[emp2]

--mysql

DROP TABLE emp2

但是如果要同时删除多个表或者删除之前要先判断一下,MYSQL就方便多了

--sqlserver

IF (OBJECT_ID('dbo.emp2') IS NOT NULL )

DROP TABLE [dbo].[emp2]

--mysql

DROP TABLE IF EXISTS emp1 ,emp2

SQLSERVER需要一张一张表判断,然后一张一张表drop

MYSQL就不一样,语法非常简洁: DROP TABLE IF EXISTS emp1 ,emp2

10、模板建表

--sqlserver

select * into xx from xx where 1=0 只复制表结构

select * into xx from xx where 1=1 复制表结构和表数据

--mysql

create table xx like xx; 只复制表结构

create table xx as select * from xx; 复制表结构和表数据

mysql复制表结构/数据的时候,并不会复制主键,索引,自增列等任何属性,仅仅是简单拷数据,而sqlserver会拷贝自增列

总结

这篇文章只是简单介绍了一下MYSQL跟SQLSERVER的语法方面的差异

以后会写更多关于MYSQL跟SQLERVER差异的文章,和我这段时间使用MYSQL期间的一些心得,大家敬请期待o(∩_∩)o

2014-7-16补充

USE test;

-- myisam引擎

CREATE TABLE TEST(

ID int unsigned not null auto_increment,

name varchar(10) not null,

key(name,id))engine=MYISAM auto_increment=100

;

-- innodb引擎

CREATE TABLE TESTIdentity(

ID int unsigned not null auto_increment,

NID INT UNSIGNED ,

name varchar(10) not null,

key(id))engine=INNODB auto_increment=100

;

--或者主键

CREATE TABLE TESTIdentity(

ID int unsigned not null auto_increment,

NID INT UNSIGNED ,

name varchar(10) not null,

key(id))engine=INNODB auto_increment=100

;

[Database4]

ErrorCode: -2147467259, Number: 1075

ErrorMessage: Incorrect table definition; there can be only one auto column and it must be defined as a key

alter table TESTIdentity modify column nid int auto_increment;

无论innodb引擎还是MYISAM引擎的表中,只能有一个自增列,并且自增列一定是索引列,无论是二级索引还是主键索引

这里跟SQLSERVER是不一样,SQLSERVER允许一张表有多个自增列,并且不需要在自增列上创建索引

MYSQL收获及体会_我的MYSQL学习心得(一) 简单语法相关推荐

  1. python高级语言应用心得体会_《Python基础学习心得》1.1

    以下资料,均为网络搜索而来,放在这里,供大家学习参考. 1.1.Python语言简介(摘自<Python教程>) 如果你经常在电脑上工作,总会有些任务会想让它自动化.比如,对一大堆文本文件 ...

  2. 怎么查看mysql帮助文档_高效查看MySQL帮助文档的方法

    在mysql的使用过程中, 可能经常会遇到以下问题: 某个操作语法忘记了, 如何快速查找? 如何快速知道当前版本上某个字段类型的取值范围? 当前版本都支持哪些函数?希望有例子说明.. 当前版本是否支持 ...

  3. mysql db模块下载_易语言MySql数据库操作类V1.0模块源码

    易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...

  4. 向mysql数据库发送指令_常用的MySQL数据库命令大全

    飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...

  5. mysql 常规命令操作_常见的MySQL命令大全

    一.连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码1.例1:连接到本机上的MYSQL.首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot ...

  6. mysql 数据库命令大全_常用的MySQL数据库命令大全

    飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...

  7. mysql 数据库安装命令_教你MySQL数据库的编译安装以及命令详解(5.7版本)

    一.安装MySQL所需的环境依赖包 [root@localhost opt]# yum -y install gcc gcc-c++ make ncurses ncurses-devel bison ...

  8. mysql 行锁 超时_技术分享 | MySQL 行锁超时排查方法优化

    作者:xuty 本文来源:原创投稿 * 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.大纲 #### 20191219 10:10:10,234 | com.ali ...

  9. mysql的原理图解_图文并茂讲解Mysql事务实现原理

    开篇 相信大家都用过事务以及了解他的特点,如原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)等.今天想跟大家一起研究下事务 ...

最新文章

  1. 《Generative Face Completion》论文笔记
  2. python进阶免费-菜鸟世界 -python进阶---生成器
  3. JS模板引擎handlerbars入门
  4. pandas去重函数
  5. python no module name_python导包显示No module named XXX问题
  6. 分布式架构--基本思想汇总
  7. redis中文显示问题
  8. kali修改root密码
  9. php 窗体移动,窗体处理 - My Labs! PHP - PHP博客
  10. 1020. 月饼 (25)-PAT乙级真题
  11. [20170515]数据库启动的一个疑问.txt
  12. daemon进程(转)
  13. ccf 路径解析 java_CCF 201604-3 路径解析
  14. 【渝粤教育】电大中专建筑施工技术 (2)作业 题库
  15. web前端期末大作业 html+css+javascript防天天生鲜官网网页设计实例 企业网站制作
  16. 银联支付(chinapay)java接入避坑指南
  17. Guawa的Splitter的工具类
  18. 黑客入侵微软邮件服务器部署勒索软件、惠普更新打印机漏洞|12月2日全球网络安全热点
  19. 让你最快速地改善代码质量的 20 条编程规范
  20. PHPMyWind支持PDF粘贴

热门文章

  1. Text Template Parser(多源数据提取软件)官方正式版V2.5 | 数据提取软件有哪些?
  2. 树莓派安装opencv报错“opencv2/xfeatures2d/cuda.hpp”,解决办法
  3. mysql按升序创建索引_Mysql创建索引
  4. 从头学前端-CSS基础03
  5. 含有function的JSON对象转换字符串与反转
  6. Tableau导入shp文件会显示与数据源通信时出错解决方法
  7. 西南科技大学OJ题 顺序表插入操作的实现0943
  8. 【Qt】QtCreator中『设计』按钮是灰色的怎么办?
  9. java流的相互转化_java 将文件流转化成字符串传输
  10. vue hash模式下微信授权登录