文章出處

我的MYSQL學習心得(二) 數據類型寬度

我的MYSQL學習心得(三) 查看字段長度

我的MYSQL學習心得(四) 數據類型

我的MYSQL學習心得(五) 運算符

我的MYSQL學習心得(六) 函數

我的MYSQL學習心得(七) 查詢

我的MYSQL學習心得(八) 插入 更新 刪除

我的MYSQL學習心得(九) 索引

我的MYSQL學習心得(十) 自定義存儲過程和函數

我的MYSQL學習心得(十一) 視圖

我的MYSQL學習心得(十二) 觸發器

我的MYSQL學習心得(十三) 權限管理

我的MYSQL學習心得(十四) 備份和恢復

我的MYSQL學習心得(十五) 日志

我的MYSQL學習心得(十六) 優化

我的MYSQL學習心得(十七) 復制

 

 

 

使用MYSQL有一段時間了,由于公司使用SQLSERVER和MYSQL,而且服務器數量和數據庫數量都比較多

管理起來比較吃力,在學習MYSQL期間我一直跟SQLSERVER進行對比

 

第一期主要是學習MYSQL的基本語法,陸續還有第二、第三、第四期,大家敬請期待o(∩_∩)o 

語法的差異

我這里主要說語法的不同

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里可以使用FIRSTAFTER關鍵字指定添加的字段的位置

--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 

 

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允許一張表有多個自增列,并且不需要在自增列上創建索引

2015-6-23補充

關于文章中的問題

問:如果有一張表,里面有個字段為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值將會丟失

這是InnoDB存儲引擎的BUG

轉自http://www.cnblogs.com/lyhabc/p/3691555.html 

 

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()