今天開始的時間比昨天晚,其實午休的時間是差不多的,只是起來後稍微看了一點新聞,10分鐘時間就沒有了,所以要養成一個好習慣還真不容易,另外就是工作時間少看新聞,太浪費時間。
昨天在執行一個alter SQL語句時總是提示錯誤,看了好久才發現忘記寫表名了,這也反映出對於基本的SQL操作還是不熟練,所以今天記錄一下,由於alter table的內容很多,所以今天只是分析一下和add有關的內容。
一、語法定義
還是參考官方文檔,其定義如下:
從這個定義上我們可以看到,必要的語句是
alter table tbl_name [command].
同時,這條語句還支持多個命令,相信很多人在修改一個表,比如增加幾列時,都會寫多個alter語句,但實際上一條就搞定了。
二、語義詳解:
下面我們對add相關的語法進行詳細分析
1. ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ] | ADD [COLUMN] (col_name column_definition,...)
通過這個定義我們可以知道以下知識點:
1)column關鍵字是可以省略的,以前我就鬧過這個笑語,有同事寫了個add 語句問我哪兒錯了,我說是沒有寫column關鍵字。。現在想起簡直好尷尬。
2)一條語句可以寫多個add語句
3)我們可以指定把這個列添加到某一列後面,或者是讓其作為第一列,相應使用after col_name或first.
4)列的定義與創建表時報定義方式一致,即我們在寫create table時怎麼給列進行定義的,這兒就怎麼定義
2. ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option]
這是添加普通索引的定義,主要有以下幾點需要注意:
1)需要使用INDEX或KEY來表明這是添加的一個索引,索引的名字可選。
2)對於某些支持多種索引類型的引擎來說,我們可以指定索引的類型,指定的語句是使用USING 索引類型名,如果未指定,則使用第一個,具體如下:
Storage EnginePermissible Index TypesInnoDBBTREEMyISAMBTREEMEMORY/HEAPHASH, BTREENDBHASH, BTREE (see note in text)從上表我們可以看到,對於常用的InnoDB和MyISAM來說,其索引都只能是BTREE,所以這個index_type其實是沒有必要指定的,通常情況下。
3)index_col_name的定義是col_name[(length)] [ASC|DESC],即要作為索引的列及其順序,支持多個列構成一個索引,默認情況下升序
4) index_option 指索引的一些附加信息,常用的是注釋,形如comment 'this is a index'.
3. ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) [index_option]
這個語句表示添加主鍵約束,對於index_type,(index_col_name,..)及[index_option]來說前面已經解釋過了,這裡再解釋一下 constraint [symbol].
constraint 是約束的意思,後面可指定一個自定義的約束名,如果不提供,則mysql會自己生成一個約束名
4. ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) [index_option] ...
這個語句表示添加惟一約束,如果symbol和index_name都指定的話,則索引名取index_name,否則哪個指定了就取哪個,如果都沒指定取列名,如果有多個列,取第一列的列名作為索引名
5. ADD FULLTEXT [INDEX|KEY] [index_name] (index_col_name,...) [index_option] .
本語句表示添加全文索引, 其可選項不必再解釋
6. ADD SPATIAL [INDEX|KEY] [index_name] (index_col_name,...) [index_option]
本語句表示添加空間索引, 其可選項也不必再解釋
7. ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition
本語句表示添加外鍵,需要注意的是reference_definition, 其形式如下:REFERENCES tbl_name (index_col_name,...), 即要指明關聯到哪個表的哪個欄位,或者是哪些欄位。
三、總結
通過分析我們可以發現,使用alter table add類的語句,主要用於添加新的列和新的索引,對於索引的創建來說,有專門的create index 語句,這個相當於是另一種寫法。記住了這個語句,我們就可以很方便的去對表結構做一些調整。