1. 程式人生 > >MYSQL 5.5從零開始學——資料表的基本操作

MYSQL 5.5從零開始學——資料表的基本操作

4.1  建立資料表

在建立完資料庫之後,接下來的工作就是建立資料表。所謂建立資料表指的是在已經建立好了的資料庫中建立新表。建立資料表的過程是規定資料列的屬性的過程,同時也是實施資料完整性(包括實體完整性、引用完整性和域完整性等)約束的過程。本節將介紹建立資料表的語法形式、如何新增主鍵約束、外來鍵約束、非空約束等。

4.1.1  建立表的語法形式

資料表屬於資料庫,在建立資料表之前,應該使用語句“USE<資料庫名>”指定操作是在哪個資料庫中進行,如果沒有選擇資料庫,會丟擲“Nodatabase selected”的錯誤。

建立資料表的語句為 CREATE TABLE,語法規則如下:

CREATE TABLE <表名>

(

欄位名1 資料型別 [列級別約束條件] [預設值],

欄位名2 資料型別 [列級別約束條件] [預設值],

……

[表級別約束條件]

);

使用CREATE TABLE建立表時,必須指定以下資訊:

⑴要建立的表的名稱,不區分大小寫,不能使用SQL語言中的關鍵字,如DROP,ALTER,INSERT等。

⑵資料表中每一個列(欄位)的名稱和資料型別,如果建立多個列,要用逗號隔開。

【例4.1】建立員工表tb_emp1,結構如【表4.1】

表4.1 tb_emp1 表結構

欄位名稱

資料型別

備註

id

INT(11)

員工編號

name

VARCHAR(25)

員工名稱

deptId

INT(11)

所在部門編號

salary

FLOAT

工資

首先選擇建立表的資料庫,SQL語句如下:

USE test;

建立tb_emp1表,SQL語句為:

CREATE TABLE tb_emp1

(

id      INT(11),

name   VARCHAR(25),

deptId  INT(11),

salary  FLOAT

);

語句執行後,便建立了一個名稱為tb_emp1的資料表,使用SHOWTABLES;語句檢視資料表是否建立成功,SQL語句如下:

mysql> SHOW TABLES;

+-----------------------+

| Tables_in_ test    |

+----------------------+

| tb_emp1        |

+----------------------+

1 row in set (0.00 sec)

可以看到test資料庫中已經有了資料表tb_tmp1,資料表建立成功。

4.1.2  使用主鍵約束

主鍵,又稱主碼,是表中一列或多列的組合。主鍵約束(PrimaryKey constraint)要求主鍵列的資料唯一,並且不允許為空。主鍵能夠惟一地標識表中的一條記錄,可以結合外來鍵來定義不同資料表之間的關係,並且可以加快資料庫查詢的速度。主鍵和記錄之間的關係如同身份證和人之間的關係,它們之間是一一對應的。主鍵分為兩種型別:單欄位主鍵,多欄位聯合主鍵。

1. 單欄位主鍵

主鍵由一個欄位組成,SQL語句格式分以下兩種情況。

⑴ 在定義列的同時指定主鍵,語法規則如下:

欄位名 資料型別 PRIMARY KEY

【例4.2】定義資料表tb_emp 2,其主鍵為id,SQL語句如下:

CREATE TABLE tb_emp2

(

id      INT(11) PRIMARY KEY,

name   VARCHAR(25),

deptId  INT(11),

salary  FLOAT

);

⑵ 在定義完所有列之後指定主鍵。

[CONSTRAINT <約束名>] PRIMARY KEY [欄位名]

【例4.3】定義資料表tb_emp 3,其主鍵為id,SQL語句如下:

CREATE TABLE tb_emp3

(

id INT(11),

name VARCHAR(25),

deptId INT(11),

salary FLOAT,

PRIMARY KEY(id)

);

上述兩個例子執行後的結果是一樣的,都會在id欄位欄位上設定主鍵約束。

2.多欄位聯合主鍵

主鍵由多個欄位聯合組成,語法規則如下:

PRIMARY KEY [欄位1, 欄位2,. . ., 欄位n]

【例4.4】定義資料表tb_emp4,假設表中間沒有主鍵id,為了唯一確定一個員工,可以把name、deptId聯合起來做為主鍵,SQL語句如下:

CREATE TABLE tb_emp4

 (

name VARCHAR(25),

deptId INT(11),

salary FLOAT,

PRIMARY KEY(name,deptId)

);

語句執行後,便建立了一個名稱為tb_emp4的資料表,name欄位和deptId欄位組合在一起成為tb_emp4的多欄位聯合主鍵。

4.1.3  使用外來鍵約束

外來鍵用來在兩個表的資料之間建立連結,它可以是一列或者多列。一個表可以有一個或多個外來鍵。外來鍵對應的是參照完整性,一個表的外來鍵可以為空值,若不為空值,則每一個外來鍵值必須等於另一個表中主鍵的某個值。

外來鍵:首先它是表中的一個欄位,它可以不是本表的主鍵,但對應另外一個表的主鍵。外來鍵主要作用是保證資料引用的完整性,定義外來鍵後,不允許刪除在另一個表中具有關聯關係的行。例如,部門表tb_dept的主鍵是id,在員工表tb_emp5中有一個鍵deptId與這個id關聯。

主表(父表):對於兩個具有關聯關係的表而言,相關聯欄位中主鍵所在的那個表即是主表。

從表(子表):對於兩個具有關聯關係的表而言,相關聯欄位中外來鍵所在的那個表即是從表。

建立外來鍵的語法規則如下:

[CONSTRAINT <外來鍵名>] FOREIGN KEY 欄位名1 [ ,欄位名2,…]

REFERENCES <主表名> 主鍵列1 [ ,主鍵列2,…]

外來鍵名為定義的外來鍵約束的名稱,一個表中不能有相同名稱的外來鍵;欄位名錶示從表的需要新增外來鍵約束的欄位列;主表名,即被從表外來鍵所依賴的表的名稱;主鍵列表示主表中定義的主鍵欄位,或者欄位組合。

【例4.5】定義資料表tb_emp5,並在tb_emp5表上建立外來鍵約束。

表4.2 tb_dept1 表結構

欄位名稱

資料型別

備註

Id

INT(11)

部門編號

Name

VARCHAR(22)

部門名稱

location

VARCHAR(50)

部門位置

建立一個部門表tb_dept1,表結構如【表4.2】,SQL語句如下:

CREATE TABLE tb_dept1

(

id       i nt(11) PRIMARY KEY,

name    VARCHAR(22)  NOT NULL,

location  VARCHAR(50)

);

定義資料表tb_emp5,讓它的鍵deptId作為外來鍵關聯到tb_dept1的主鍵id,SQL語句為:

CREATE TABLE tb_emp5

(

id      INT(11) PRIMARY KEY,

name   VARCHAR(25),

deptId  INT(11),

salary   FLOAT,

CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)

);

以上語句執行成功之後,在表tb_emp5上添加了名稱為fk_emp_dept1的外來鍵約束,外來鍵名稱為deptId,其依賴於表tb_dept1的主鍵id。

4.1.4  使用非空約束

非空約束(NotNull constraint)指欄位的值不能為空。對於使用了非空約束的欄位如果使用者在新增資料時,沒有指定值,資料庫系統會報錯。

非空約束的語法規則如下:

欄位名 資料型別 not null

【例4.6】定義資料表tb_emp6,指定員工的名稱不能為空,SQL語句如下:

CREATE TABLE tb_emp6

(

id     INT(11) PRIMARY KEY,

name   VARCHAR(25) NOT NULL,

deptId  INT(11),

salary  FLOAT,

CONSTRAINT fk_emp_dept2 FOREIGN KEY (deptId) REFERENCES tb_dept1(id)

);

執行後在tb_emp6中建立了一個Name欄位,其插入值不能為空(NOTNULL)。

4.1.5  使用唯一性約束

唯一性約束(UniqueConstraint)要求新增該約束的列欄位的值唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複值。

新增唯一性約束的語法規則如下:

⑴ 在定義完列之後直接指定唯一約束,語法規則如下:

欄位名 資料型別 UNIQUE

【例4.7】定義資料表tb_dept2,指定部門的名稱唯一,SQL語句如下:

CREATE TABLE tb_dept2

(

id      INT(11) PRIMARY KEY,

name    VARCHAR(22) UNIQUE,

location  VARCHAR(50)

);

⑵ 在定義完所有列之後指定唯一約束,語法規則如下:

[CONSTRAINT <約束名>] UNIQUE(<欄位名>)

【例4.8】定義資料表tb_dept3,指定部門的名稱唯一,SQL語句如下:

CREATE TABLE tb_dept3

(

id      INT(11) PRIMARY KEY,

name    VARCHAR(22),

location  VARCHAR(50),

CONSTRAINT STH UNIQUE(name)

);

UNIQUE和PRIMARYKEY區別:一個表中可以有多個欄位宣告為UNIQUE,但只能由一個PRIMARYKEY 宣告;宣告為PRIMAYKEY的列不允許有空值,但是宣告為UNIQUE的欄位允許為空值(NULL)的存在。

4.1.6  使用預設約束

預設約束(DefaultConstraint)指定某列的預設值。如男性同學較多,性別就可以預設為‘男’。如果插入一條新的記錄時沒有為這個欄位賦值,那麼系統會自動為這個欄位賦值為‘男’。

預設約束的語法規則如下:

欄位名 資料型別DEFAULT 預設值

【例4.9】定義資料表tb_emp7,指定員工的部門編號預設為1111,SQL語句如下:

CREATE TABLE tb_emp7

(

id      INT(11) PRIMARY KEY,

name   VARCHAR(25) NOT NULL,

deptId  INT(11) DEFAULT 1111,

salary  FLOAT,

CONSTRAINT fk_emp_dept3 FOREIGN KEY (deptId) REFERENCES tb_dept1(id)

);

以上語句執行成功之後,表tb_emp7上得欄位deptId擁有了一個預設的值1111,新插入的記錄如果沒有指定部門編號,則預設的都為1111。

4.1.7  設定表的屬性值自動增加

在資料庫應用中,經常希望在每次插入新記錄時,系統就會自動生成欄位的主鍵值。可以通過為表主鍵新增AUTO_INCREMENT關鍵字來實現。預設的,在MySQL中AUTO_INCREMENT的初始值值是1,每新增一條記錄,欄位值自動加1。一個表只能有一個欄位使用AUTO_INCREMENT約束,且該欄位必須為主鍵的一部分。AUTO_INCREMENT約束的欄位可以是任何整數型別(TINYINT、SMALLIN、INT、BIGINT等)。

設定欄位值自增屬性的語法規則如下:

欄位名 資料型別 AUTO_INCREMENT

【例4.10】定義資料表tb_emp8,指定員工的編號自動遞增,SQL語句如下:

CREATE TABLE tb_emp8

(

id      INT(11) PRIMARY KEY AUTO_INCREMENT,

name   VARCHAR(25) NOT NULL,

deptId  INT(11),

salary  FLOAT,

CONSTRAINT fk_emp_dept5 FOREIGN KEY (deptId) REFERENCES tb_dept1(id)

);

上述例子執行後,會建立名稱為tb_emp8的資料表。表tb_emp8中的id欄位的值在新增新記錄的時候會自動增加,在插入記錄的時候,預設的自增欄位id的值從1開始,每次新增一條新記錄,該值自動加1。

例如,執行如下插入語句:

mysql> INSERT INTO tb_emp8 (name,salary)

-> VALUES('Lucy',1000), ('Lura',1200),('Kevin',1500);

語句執行完後,tb_emp8表中增加3條記錄,在這裡,並沒有輸入id的值,但系統已經自動新增該值,使用SELECT命令檢視記錄。

mysql> SELECT * FROM tb_emp8;

+----+-------+--------+--------+

| id | name   | deptId| salary  |

+----+-------+--------+--------+

|  1 |Lucy   |   NULL|   1000  |

|  2 |Lura   |   NULL|   1200  |

|  3 | Kevin  |   NULL|   1500  |

+----+-------+--------+--------+

3 rows in set (0.00 sec)

4.2  檢視資料表結構

使用SQL語句建立好資料表之後,可以查看錶結構的定義,以確認表的定義是否正確。MySQL中查看錶結構分別可以使用DESCRIBE和SHOWCREATE TABLE語句。本節將針對這兩個語句分別進行詳細的講解。

4.2.1  查看錶基本結構語句DESCRIBE

DESCRIBE/DESC語句可以查看錶的欄位資訊,其中包括:欄位名、欄位資料型別、是否為主鍵、是否有預設值等。語法規則如下:

DESCRIBE 表名;

或者簡寫為:

DESC 表名;

【例4.11】分別使用DESCRIBE和DESC查看錶tb_dept1和表tb_emp1的表結構。

檢視tb_dept1表結構,SQL語句如下:

mysql> DESCRIBE tb_dept1;

+-----------+---------------+------+-----+---------+-------+

| Field    | Type     | Null | Key | Default | Extra |

+-----------+---------------+------+-----+---------+-------+

| id       | int(11)    | NO  | PRI | NULL |      |

| name    |varchar(22) | NO  |    | NULL |     |

| location  | varchar(50) | YES |    |NULL |      |

+-----------+---------------+------+-----+---------+--------+

檢視tb_emp1表結構,SQL語句如下:

mysql> DESC tb_emp1;

+--------+--------------+------+-----+---------+-------+

| Field  |Type      | Null | Key | Default | Extra |

+--------+--------------+------+-----+---------+-------+

| id     | int (11)   | YES |    |NULL  |     |

| name  |varchar(25) | YES |    | NULL  |     |

| deptId | int (11)     | YES |   | NULL  |     |

| salary  |float      | YES |    | NULL  |      |

+---------+-------------+-------+-----+---------+-------+

NULL:表示該列是否可以儲存NULL值。

Key:表示該列是否已編制索引。PRI表示該列是表主鍵的一部分。UNI表示該列是UNIQUE索引的一部分。MUL 表示在列中某個給定值允許出現多次。

default:表示該列是否有預設值,如果有的話值是多少。

Extra:表示可以獲取的與給定列有關的附加資訊,例如 AUTO_INCREMENT等。

4.2.2  查看錶詳細結構語句SHOW CREATE TABLE

SHOWCREATE TABLE語句可以用來顯示建立表時的CREATETABLE 語句,語法格式如下:

SHOW CREATE TABLE <表名\G>;

如果不加‘\G’引數,顯示的結果可能非常混亂,加上引數‘\G’之後,可使顯示結果更加直觀,易於檢視。

【例4.12】使用SHOWCREATE TABLE查看錶tb_emp1的詳細資訊,SQL語句如下:

mysql> SHOW CREATE TABLE tb_emp1;

+--------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------+

| Table  |Create Table

                                                                        |

+--------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------+

| fruits | CREATE TABLE `fruits` (

  `f_id`char(10) NOT NULL,

  `s_id`int(11) NOT NULL,

  `f_name`char(255) NOT NULL,

  `f_price`decimal(8,2) NOT NULL,

  PRIMARYKEY (`f_id`),

  KEY`index_name` (`f_name`),

  KEY`index_id_price` (`f_id`,`f_price`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------+

使用引數‘\G’之後的結果如下:

mysql> SHOW CREATE TABLE tb_emp1\G;

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

      Table: tb_emp1

Create Table: CREATE TABLE `tb_emp1` (

  `id`int(11) DEFAULT NULL,

  `name`varchar(25) DEFAULT NULL,

  `deptId`int(11) DEFAULT NULL,

  `salary`float DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

4.3  修改資料表

修改表指的是修改資料庫中已經存在的資料表的結構。常用的修改表的操作有:修改表名、修改欄位資料型別或欄位名、增加和刪除欄位、修改欄位的排列位置,更改表的儲存引擎,刪除表的外來鍵約束等。本節將對和修改表有關的操作進行講解。

4.3.1  修改表名

MySQL是通過ALTERTABLE語句來實現表名的修改的,具體的語法規則如下:

ALTER TABLE <舊錶名> RENAME [TO] <新表名>;

其中TO為可選引數,使用與否均不影響結果。

【例4.13】將資料表tb_dept3改名為tb_department3。

執行修改表名操作之前,使用SHOWTABLES檢視資料庫中所有的表。

mysql> SHOW TABLES;

+---------------------+

| Tables_in_test    |

+---------------------+

| tb_dept1        |

| tb_dept2       |

| tb_dept3       |

           省略部分內容

使用ALTERTABLE將表tb_dept3改名為tb_department3,SQL語句如下:

ALTER TABLE tb_dept3 RENAME tb_department3;

語句執行之後,檢驗表tb_dept3是否改名成功。使用SHOW TABLES檢視資料庫中的表,結果如下:

mysql> SHOW TABLES;

+---------------------+

| Tables_in_test    |

+---------------------+

| tb_department3  |

| tb_dept         |

| tb_dept2        |

           省略部分內容

經過比較可以看到資料表列表中已經有了名稱為tb_department3的表。

4.3.2  修改欄位的資料型別

修改欄位的資料型別,就是把欄位的資料型別轉換成另一種資料型別。在MySQL中修改欄位資料型別的語法規則如下:

ALTER TABLE <表名> MODIFY <欄位名>  <資料型別>

其中“表名”指要修改資料型別的欄位所在表的名稱,“欄位名”指需要修改的欄位,“資料型別”指修改後欄位的新資料型別。

【例4.14】將資料表tb_dept1中name欄位的資料型別由VARCHAR(22)的修改成VARCHAR(30)。

執行修改欄位資料型別操作之前,使用DESC檢視tb_dept表結構,結果如下:

mysql> DESC tb_dept1;

+----------+---------------+---------+--------+-------------+-------+

| Field   |Type       |Null  | Key   |Default  | Extra |

+----------+---------------+---------+--------+-------------+-------+

| id      | int(11)     | NO   | PRI   | NULL   |     |

| name   | varchar(22)  | YES  |       | NULL  |     |

| location | varchar(50)  | YES  |     |NULL    |     |

+----------+---------------+--------+---------+-------------+-------+

3 rows in set (0.00 sec)

可以看到現在name欄位的資料型別為VARCHAR(22),下面修改其型別。輸入如下SQL語句並執行。

ALTER TABLE tb_dept1 MODIFY name VARCHAR(30);

再次使用DESC查看錶,結果如下:

mysql> DESC tb_dept1;

+----------+---------------+---------+--------+-------------+-------+

| Field   |Type       |Null  | Key   |Default   | Extra|

+----------+---------------+---------+--------+-------------+-------+

| id      | int(11)     | NO   | PRI   | NULL   |     |

| name   | varchar(30) | YES  |       | NULL  |     |

| location | varchar(50)  | YES  |     |NULL    |     |

+----------+---------------+--------+---------+-------------+-------+

3 rows in set (0.00 sec)

語句執行之後,檢驗會發現表tb_dept表中name欄位的資料型別已經修改成了VARCHAR(30),修改成功。

4.3.3  修改欄位名

MySQL中修改表字段名的語法規則如下:

ALTER TABLE <表名> CHANGE <舊欄位名> <新欄位名> <新資料型別>;

其中,“舊欄位名”指修改前的欄位名;“新欄位名”指修改後的欄位名;“新資料型別”指修改後的資料型別,如果不需要修改欄位的資料型別,可以將新資料型別設定成與原來一樣即可,但資料型別不能為空。

【例4.15】將資料表tb_dept1中的location欄位名稱改為loc,資料型別保持不變,SQL語句如下:

ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);

使用DESC查看錶tb_dept1,會發現欄位的名稱已經修改成功,結果如下:

mysql> DESC tb_dept1;

+----------+---------------+---------+--------+-------------+-------+

| Field   |Type       |Null  | Key   |Default  | Extra |

+----------+---------------+---------+--------+-------------+-------+

| id      | int(11)     | NO   | PRI   | NULL   |     |

| name   | varchar(30) | YES  |       | NULL  |     |

| loc     |varchar(50)  | YES  |      |NULL    |     |

+----------+---------------+--------+---------+-------------+-------+

3 rows in set (0.00 sec)

【例4.16】將資料表tb_dept1中的loc欄位名稱改為location,同時將資料型別保持變為VARCHAR(60),SQL語句如下:

ALTER TABLE tb_dept1CHANGE loc location  VARCHAR(60);

使用DESC查看錶tb_dept1,會發現欄位的名稱和資料型別均已經修改成功,結果如下:

mysql> DESC tb_dept1;

+----------+---------------+---------+--------+-------------+-------+

| Field   |Type       |Null  | Key   |Default  | Extra |

+----------+---------------+---------+--------+-------------+-------+

| id      | int(11)     | NO   | PRI   | NULL   |     |

| name   | varchar(30) | YES  |       | NULL  |     |

| location | varchar(60)  | YES  |     |NULL    |     |

+----------+---------------+--------+---------+-------------+-------+

3 rows in set (0.00 sec)

技巧:CHANGE也可以只修改資料型別,實現和MODIFY同樣的效果,方法是將SQL語句中的“新欄位名”和“舊欄位名”設定為相同的名稱,只改變“資料型別”。

4.3.4  新增欄位

隨著業務需求的變化,可能需要在已經存在的表中新增新的欄位。一個完整欄位包括欄位名,資料型別,完整性約束。新增欄位的語法格式如下:

ALTER TABLE <表名> ADD <新欄位名> <資料型別>

[約束條件] [FIRST |AFTER 已存在欄位名];

新欄位名為需要新增的欄位的名稱;“FIRST”為可選引數,其作用是將新新增的欄位設定為表的第一個欄位;“AFTER”為可選引數,其作用是將新新增的欄位新增到指定的“已存在欄位名”的後面。

1新增無完整性約束條件的欄位

【例4.17】在資料表tb_dept1中新增一個沒有完整性約束的INT型別的欄位managerId(部門經理編號),SQL語句如下:

ALTER TABLE tb_dept1 ADD managerId INT(10);

使用DESC查看錶tb_dept1,會發現在表的最後添加了一個名為managerId的INT型別的欄位,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type       | Null    | Key   |Default  | Extra  |

+-------------+-----------------+----------+--------+-------------+--------+

| id        | int(11)      | NO   | PRI   | NULL   |      |

| name         | varchar(30)  | YES    |      | NULL  |      |

| location  | varchar(60)  | YES    |      |NULL   |      |

| managerId | int(10)      | YES    |      | NULL    |      |

+-------------+----------------+-----------+--------+-------------+--------+

4 rows in set (0.03 sec)

2新增有完整性約束條件的欄位

【例4.18】在資料表tb_dept1中新增一個不能為空的VARCHAR(12)型別的欄位column1,SQL語句如下:

ALTER TABLE tb_dept1 ADD column1 VARCHAR(12)not  null;

使用DESC查看錶tb_dept1,會發現在表的最後添加了一個名為column1的VARCHAR(12)型別且不為空的欄位,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type       | Null   | Key   |Default  | Extra |

+-------------+-----------------+----------+--------+-------------+--------+

| id        | int(11)     | NO    | PRI   | NULL   |      |

| name         | varchar(30)  | YES    |      | NULL  |      |

| location  | varchar(60)  | YES    |      |NULL   |      |

| managerId | int(10)      |YES    |      | NULL    |      |

| column1  |varchar(12)   | NO    |      |NULL    |      |

+--------------+----------------+-----------+--------+-------------+--------+

5 rows in set (0.00 sec)

3在表的第一列新增一個欄位

【例4.19】在資料表tb_dept1中新增一個INT型別的欄位column2,SQL語句如下:

ALTER TABLE tb_dept 1ADD column2 INT(11) FIRST;

使用DESC查看錶tb_dept1,會發現在表第一列添加了一個名為column2的INT(11)型別欄位,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type      | Null     | Key  |Default   | Extra  |

+-------------+-----------------+----------+--------+-------------+--------+

| column2  |int(11)      | YES    |      |NULL    |      |

| id        | int(11)     | NO    | PRI   | NULL   |      |

| name     | varchar(30) | YES    |      |NULL   |      |

| location  | varchar(60)  | YES    |      |NULL   |      |

| managerId | int(10)      |YES    |      | NULL    |      |

| column1  |varchar(12)   | NO    |      |NULL    |      |

+--------------+----------------+-----------+--------+-------------+--------+

6 rows in set (0.00 sec)

4在表的指定列之後新增一個欄位

【例4.20】在資料表tb_dept1中name列後新增一個INT型別的欄位column3,SQL語句如下:

ALTER TABLE tb_dept1 ADD column3 INT(11) AFTERname;

使用DESC查看錶tb_dept1,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type      | Null    | Key  | Default  | Extra  |

+-------------+-----------------+----------+--------+-------------+--------+

| column2  |int(11)      | YES    |      |NULL    |      |

| id        | int(11)     | NO    | PRI   | NULL   |      |

| name         | varchar(30)  | YES    |      | NULL  |      |

| column3  |int(11)      | YES    |      | NULL   |      |

| location  | varchar(60)  | YES    |      |NULL   |      |

| managerId | int(10)      |YES    |      | NULL    |      |

| column1  |varchar(12)   | NO    |      |NULL    |      |

+--------------+----------------+-----------+--------+-------------+--------+

7 rows in set (0.03 sec)

可以看到,tb_dept1表中增加了一個名稱為column3的欄位,其位置在指定的name欄位後面,新增欄位成功。

4.3.5  刪除欄位

刪除欄位是將資料表中的某個欄位從表中移除,語法格式如下:

ALTER TABLE <表名> DROP <欄位名>;

“欄位名”指需要從表中刪除的欄位的名稱。

【例4.21】刪除資料表tb_dept1表中的column2欄位。

首先,執行刪除欄位之前,使用DESC檢視tb_dept1表結構,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type       | Null   | Key  | Default   | Extr  |

+-------------+-----------------+----------+--------+-------------+--------+

| column2  |int(11)      | YES    |      |NULL    |      |

| id        | int(11)     | NO    | PRI   | NULL   |      |

| name         | varchar(30)  | YES    |      | NULL  |      |

| column3  |int(11)       | YES    |      |NULL  |      |

| location  | varchar(60)   | YES   |      | NULL   |      |

| managerId | int(10)       |YES    |      |NULL   |      |

| column1  |varchar(12)   | NO    |      |NULL    |      |

+--------------+----------------+-----------+--------+-------------+--------+

6 rows in set (0.03 sec)

刪除column2欄位,SQL語句如下:

ALTER TABLE tb_dept1 DROP column2;

再次使用DESC查看錶tb_dept1,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type       | Null   | Key  | Default   | Extr  |

+-------------+-----------------+----------+--------+-------------+--------+

| id        | int(11)     | NO    | PRI   | NULL   |      |

| name         | varchar(30)  | YES    |      | NULL  |      |

| column3  |int(11)       | YES    |      |NULL  |      |

| location  | varchar(60)   | YES   |      |NULL   |      |

| managerId | int(10)       | YES    |      |NULL   |      |

| column1  |varchar(12)   | NO    |      |NULL    |      |

+--------------+----------------+-----------+--------+-------------+--------+

6 rows in set (0.03 sec)

可以看到,tb_dept1表中已經不存在名稱為column2的欄位,刪除欄位成功。

4.3.6  修改欄位的排列位置

對於一個數據表來說,在建立的時候,欄位在表中的排列順序就已經確定了。但表的結構並不是完全不可以改變的,可以通過ALTERTABLE來改變表中欄位的相對位置。語法格式如下:

ALTER TABLE <表名> MODIFY <欄位1> <資料型別> FIRST|AFTER <欄位2>;

“欄位1”指要修改位置的欄位,“資料型別”指“欄位1”的資料型別,“FIRST”為可選引數,指將“欄位名1”修改為表的第一個欄位,“AFTER 欄位2”指將“欄位1”插入到“欄位2”後面。

1. 修改欄位為表的第一個欄位

【例4.22】將資料表tb_dept中的column1欄位修改為表的第一個欄位,SQL語句如下:

ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12)FIRST;

使用DESC查看錶tb_dept1,發現欄位column1已經被移至表的第一列,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type      | Null    | Key  | Default   | Extra |

+-------------+-----------------+----------+--------+-------------+--------+

| column1  |varchar(12)   | NO    |      |NULL    |      |

| id        | int(11)     | NO    | PRI   | NULL   |      |

| name         | varchar(30)  | YES    |      | NULL  |      |

| column3  |int(11)      | YES    |      | NULL   |      |

| location  | varchar(60)  | YES    |      |NULL   |      |

| managerId | int(10)      |YES    |      | NULL    |      |

+--------------+----------------+-----------+--------+-------------+--------+

6 rows in set (0.03 sec)

2 修改欄位到表的指定列之後

【例4.23】將資料表tb_dept1中的column1欄位插入到location欄位後面,SQL語句如下:

ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12)AFTER location;

使用DESC查看錶tb_dept1,結果如下:

mysql> DESC tb_dept1;

+-------------+-----------------+----------+--------+-------------+--------+

| Field     | Type      | Null    | Key  | Default  | Extra  |

+-------------+-----------------+----------+--------+-------------+--------+

| id        | int(11)     | NO    | PRI   | NULL   |      |

| name         | varchar(30)  | YES    |      | NULL  |      |

| column3  |int(11)      | YES   |      |NULL    |      |

| location  | varchar(60)  | YES    |      |NULL   |      |

| column1  |varchar(12)   | NO    |      |NULL    |      |

| managerId | int(10)      |YES    |      | NULL    |      |

+--------------+----------------+-----------+--------+-------------+--------+

6 rows in set (0.03 sec)

可以看到,tb_dept1表中的欄位column1已經被移至location欄位之後。

4.3.7  更改表的儲存引擎

儲存引擎是MySQL中的資料儲存在檔案或者記憶體中時採用的不同技術實現。可以根據自己的需要,選擇不同的引擎,甚至可以為每一張表選擇不同的儲存引擎。MySQL中主要儲存引擎有:MyISAM、InnoDB、MEMORY(HEAP)、BDB、FEDERATED等。可以使用SHOWENGINES;語句檢視系統所支援的儲存引擎。【表4.3】列出了5.5.13版本的MySQL所支援的儲存引擎。

表4.3 MySQL支援的儲存引擎

引擎名

是否支援

FEDERATED

MRG_MYISAM

MyISAM

BLACKHOLE

CSV

MEMORY

ARCHIVE

InnoDB

預設

PERFORMANCE_SCHEMA

更改表的儲存引擎的語法格式如下:

ALTER TABLE <表名> ENGINE=<更改後的儲存引擎名>;

【例4.24】將資料表tb_department3的儲存引擎修改為MyISAM。

在修改儲存引擎之前,先使用SHOWCREATE TABLE查看錶tb_department3當前的儲存引擎,結果如下。

mysql> SHOW CREATE TABLE tb_department3 \G;

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

      Table: tb_department3

Create Table: CREATE TABLE `tb_department3` (

  `id`int(11) NOT NULL,

  `name`varchar(22) DEFAULT NULL,

  `location`varchar(50) DEFAULT NULL,

  PRIMARYKEY (`id`),

  UNIQUE KEY`STH` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

可以看到,表tb_department3當前的儲存引擎為ENGINE=InnoDB,接下來修改儲存引擎型別,輸入如下SQL語句並執行:

mysql> ALTER TABLE tb_department3ENGINE=MyISAM;

使用SHOWCREATE TABLE再次查看錶tb_department3的儲存引擎,發現表tb_department3的儲存引擎變成了“MyISAM”,結果如下:

mysql> SHOW CREATE TABLE tb_department3 \G;

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

      Table:tb_department3

Create Table: CREATE TABLE `tb_department3` (

  `id`int(11) NOT NULL,

  `name`varchar(22) DEFAULT NULL,

  `location`varchar(50) DEFAULT NULL,

  PRIMARYKEY (`id`),

  UNIQUE KEY`STH` (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

4.3.8  刪除表的外來鍵約束

對於資料庫中定義的外來鍵,如果不再需要,可以將其刪除。外來鍵一旦刪除,就會解除主表和從表間的關聯關係,MySQL中刪除外來鍵的語法格式如下:

ALTER TABLE <表名> DROP FOREIGN KEY <外來鍵約束名>

“外來鍵約束名”指在定義表時CONSTRAINT關鍵字後面的引數,詳細內容請參考4.1.2節的【使用外來鍵約束】。

【例4.25】刪除資料表tb_emp9中的外來鍵約束。

首先建立表tb_emp9,建立外來鍵deptId關聯tb_dept1表的主鍵id,SQL語句如下:

CREATE TABLE tb_emp9

(

id      INT(11) PRIMARY KEY,

name   VARCHAR(25),

deptId  INT(11),

salary   FLOAT,

CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept1(id)

);

使用SHOWCREATE TABLE查看錶tb_emp9結構,結果如下:

mysql> SHOW CREATE TABLE tb_emp9 \G;

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

      Table: tb_emp9

Create Table: CREATE TABLE `tb_emp9` (

  `id`int(11) NOT NULL,

  `name`varchar(25) DEFAULT NULL,

  `deptId`int(11) DEFAULT NULL,

  `salary`float DEFAULT NULL,

  PRIMARY KEY(`id`),

  KEY`fk_emp_dept` (`deptId`),

  CONSTRAINT`fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

可以看到,已經成功添加了表的外來鍵,下面刪除外來鍵約束,SQL語句如下:

ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp_dept;

執行完畢之後,將刪除表tb_emp9的外來鍵約束,使用SHOWCREATE TABLE次查看錶tb_emp9結構,結果如下:

mysql> SHOW CREATE TABLE tb_emp9 \G;

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

       Table:tb_emp9

Create Table: CREATE TABLE `tb_emp9` (

  `id`int(11) NOT NULL,

  `name`varchar(25) DEFAULT NULL,

  `deptId`int(11) DEFAULT NULL,

  `salary`float DEFAULT NULL,

  PRIMARYKEY (`id`),

  KEY`fk_emp_dept` (`deptId`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

可以看到,tb_emp9中已經不存在FOREIGNKEY,原有的名稱為fk_emp_dept的外來鍵約束刪除成功。

4.4  刪除資料表

刪除資料表是將資料庫中已經存在的表從資料庫中刪除。注意,刪除表的同時,表的定義和表中所有的資料均會被刪除,因此,在刪除操作前,最好對錶中的資料做個備份,以免造成無法挽回的後果。本節將詳細講解資料庫表的刪除方法。

4.4.1  刪除沒有被關聯的表

MySQL中,使用DROPTABLE可以一次刪除一個或多個沒有被其它表關聯的資料表。語法格式如下:

DROP TABLE [IF EXISTS]表1, 表2, . . . 表n;

其中“表n”指要刪除的表的名稱,後面可以同時刪除多個表,只需要將要刪除的表名依次寫在後面,相互之間用逗號隔開即可。如果要刪除的資料表不存在,則MySQL會提示一條錯誤資訊,“ERROR1051 (42S02): Unknown table '表名'”。引數“IF EXISTS”用於在刪除前判斷刪除的表是否存在,加上該引數後,再刪除表的時候,如果表不存在,SQL語句可以順利執行,但是會發出警告(warning)。

在前面的例子中,已經建立了名為tb_dept2的資料表,如果沒有,請讀者輸入語句,建立該表,SQL語句如【例4.8】。下面使用刪除語句將該表刪除。

【例4.26】刪除資料表tb_dept2,SQL語句如下:

DROP TABLE IF EXISTS tb_dept2;

語句執行完畢之後,使用SHOWTABLES命令檢視當前資料庫中所有的表,SQL語句如下:

mysql> SHOW TABLES;

+---------------------+

| Tables_in_test   |

+---------------------+

| tb_department3 |

| tb_dept1       |

……省略部分內容

執行結果可以看到,資料表列表中已經不存在名稱為tb_dept2的表,刪除操作成功。

4.4.2  刪除被其它表關聯的主表

資料表之間存在外來鍵關聯的情況下,如果直接刪除父表,結果會顯示失敗,原因是直接刪除,將破壞表的參照完整性。如果必須要刪除,可以先刪除與之關聯的子表,再刪除父表。但是這樣同時刪除了兩個表中的資料。有的情況下可能要保留子表,這時如要單獨刪除父表,只需將關聯的表的外來鍵約束條件取消,然後就可以刪除父表,下面講解這種方法。

在資料庫中建立兩個關聯表,首先,建立表tb_dept2,SQL語句如下:

CREATE TABLE tb_dept2

(

id       INT(11) PRIMARY KEY,

name    VARCHAR(22),

location  VARCHAR(50)

);

接下來建立表tb_emp,SQL語句如下:

CREATE TABLE tb_emp

(

id       INT(11)PRIMARY KEY,

name    VARCHAR(25),

deptId   INT(11),

salary   FLOAT,

CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept2(id)

);

使用SHOWCREATE TABLE命令查看錶tb_emp的外來鍵約束,結果如下:

mysql> SHOW CREATE TABLE tb_emp\G;

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

       Table: tb_emp

Create Table: CREATE TABLE `tb_emp` (

  `id` int(11) NOT NULL,

  `name` varchar(25) DEFAULTNULL,

  `deptId` int(11) DEFAULTNULL,

  `salary` float DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `fk_emp_dept`(`deptId`),

  CONSTRAINT `fk_emp_dept`FOREIGN KEY (`deptId`) REFERENCES `tb_dept2` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

可以看到,以上執行結果建立了兩個關聯表tb_dept2和表tb_emp,其中tb_emp表為子表,具有名稱為fk_emp_dept外來鍵約束,tb_dept2為父表,其主鍵id被子表tb_emp所關聯。

【例4.27】刪除被資料表tb_emp關聯的資料表tb_dept2。

首先直接刪除父表tb_dept2,輸入刪除語句如下:

mysql> DROP TABLE tb_dept2;

ERROR 1217 (23000): Cannot delete or update aparent row: a foreign key constraint fails

可以看到,如前所講,在存在外來鍵約束時,主表不能被直接刪除。

接下來,解除關聯子表tb_emp的外來鍵約束,SQL語句如下:

ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;

語句成功執行後,將取消表tb_enp和表tb_dept2之間的關聯關係,此時,可以輸入刪除語句,將原來的父表tb_dept2刪除,SQL語句如下:

DROP TABLE tb_dept2;

最後通過SHOWTABLES;檢視資料表列表,如下所示:

mysql> SHOW TABLES;

+---------------------+

| Tables_in_test    |

+---------------------+

| tb_department3 |

| tb_dept1        |

……省略部分內容

可以看到,資料表列表中已經不存在名稱為tb_dept2的表。

4.5  綜合案例——資料表的基本操作

本章全面介紹了MySQL中資料表的各種操作,如建立表、新增各類約束、查看錶結構,以及修改和刪除表。讀者應該掌握這些基本的操作,為以後的學習打下堅實的基礎。本章給出一個綜合案例,讓讀者全面回顧一下本章的知識要點,並通過這些操作來檢驗自己是否已經了掌握資料表的常用操作。

1. 案例目的:建立、修改和刪除表,掌握資料表的基本操作。

建立資料庫company,按照下面給出的表結構在company資料庫中建立兩個資料表offices和employees,按照操作過程完成對資料表的基本操作。

表4.2 offices表結構

欄位名

資料型別

主鍵

外來鍵

非空

唯一

自增

officeCode

INT(10)

city

INT(11)

address

VARCHAR(50)

country

VARCHAR(50)

postalCode

VARCHAR(25)

表4.3 employees表結構

欄位名

資料型別

主鍵

外來鍵

非空

唯一

自增

employeeNumber

INT(11)

lastName

VARCHAR(50)

firstName

VARCHAR(50)

mobile

VARCHAR(25)

officeCode

VARCHAR(10)

jobTitle

VARCHAR(50)

birth

DATETIME

note

VARCHAR(255)

sex

VARCHAR(5)

2. 案例操作過程

步驟1:登陸MySQL資料庫。

開啟windows命令列,輸入登陸使用者名稱和密碼:

C:\>mysql –h localhost -u root -p

Enter password: **

或者開啟MySQL5.5Command Line Client,只用輸入使用者密碼也可以登陸。登陸成功後顯示如下資訊:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.5.13 MySQL Community Server(GPL)

Copyright (c) 2000, 2010, Oracle and/or itsaffiliates. All rights reserved.

Oracle is a registered trademark of OracleCorporation and/or its

affiliates. Other names may be trademarks of theirrespective

owners.

Type 'help;' or '\h' for help. Type '\c' to clearthe current input statement.

mysql>

登陸成功,可以輸入SQL語句進行操作。

步驟2:建立資料庫company。

建立資料庫company的語句如下:

mysql> CREATE DATABASE company;

Query OK, 1 row affected (0.00 sec)

結果顯示建立成功,在company資料庫中建立表,必須先選擇該資料庫,輸入語句如下:

mysql> USE company;

Database changed

結果顯示選擇資料庫成功。

步驟3:建立表offices。

建立表offices的語句如下:

CREATE TABLE offices

(

officeCode  INT(10) NOT NULLUNIQUE,

city        VARCHAR(50) NOTNULL,

address     VARCHAR(50) NOTNULL,

country     VARCHAR(50) NOT NULL,

postalCode  VARCHAR(15) NOTNULL,

PRIMARY KEY  (officeCode)

);

執行成功之後,使用SHOWTABLES;語句檢視資料庫中的表,語句如下:

mysql> show tables;

+-----------------------+

| Tables_in_company |

+-----------------------+

| offices          |

+-----------------------+

1 row in set (0.00 sec)

可以看到,資料庫中已經有了資料表offices,建立成功。

步驟4建立表employees。

建立表employees的語句如下:

CREATE TABLE employees

(

employeeNumber  INT(11) NOTNULL PRIMARY KEY AUTO_INCREMENT,

lastName         VARCHAR(50)NOT NULL,

firstName        VARCHAR(50)NOT NULL,

mobile           VARCHAR(25) NOT NULL,

officeCode       INT(10) NOTNULL,

jobTitle         VARCHAR(50)NOT NULL,

birth            DATETIME,

note            VARCHAR(255),

sex             VARCHAR(5),

CONSTRAINT office_fk FOREIGN KEY(officeCode)  REFERENCES offices(officeCode)

);

執行成功之後,使用SHOWTABLES;語句檢視資料庫中的表,語句如下:

mysql> show tables;

+------------------------+

| Tables_in_company |

+------------------------+

| employees        |

| offices           |

+------------------------+

2 rows in set (0.00 sec)

可以看到,現在資料庫中已經建立好了employees和offices兩個資料表。要檢查表的結構是否按照要求建立,使用DESC分別檢視兩個表的結構,如果語句正確,則顯示結果如下:

mysql>DESC offices;

+--------------+-------------+-------+------+---------+-------+

| Field      | Type     | Null  | Key | Default | Extra |

+--------------+-------------+-------+------+---------+-------+

| officeCode  | int(10)   | NO  | PRI | NULL |     |

| city       | varchar(50) | NO  |    |NULL  |     |

| address    | varchar(50) |NO  |   | NULL  |     |

| country   | varchar(50) | NO |   | NULL  |     |

| postalCode | varchar(15) | NO  |    |NULL  |     |

+------------+---------------+--------+-----+---------+-------+

5 rows in set (0.02 sec)

mysql>DESC employees;

+----------------------+--------------+--------+-------+---------+--------------------+

| Field           | Type     | Null  | Key | Default |Extra          |

+----------------------+--------------+--------+-------+---------+--------------------+

| employeeNumber | int(11)    | NO   | PRI  | NULL | auto_increment |

| lastName       | varchar(50)  | NO  |     | NULL |              |

| firstName      |varchar(50)  | NO   |      | NULL|              |

| mobile         |varchar(25)  | NO   |    | NULL |              |

| officeCode     |int(10)      | NO   | MUL | NULL |              |

| jobTitle        | varchar(50) | NO   |     | NULL |              |

| birth          |datetime     | YES  |     |NULL |              |

| note           |varchar(255) | YES  |     | NULL |             |

| sex            | varchar(5)   | YES |     | NULL |              |

+--------------------+----------------+--------+-------+---------+--------------------+

9 rows in set (0.00 sec)

可以看到,兩個表中欄位分別滿足【表4.2】和【表4.3】中要求的資料型別和約束型別。

步驟5:將表employees的mobile欄位修改到officeCode欄位後面。

修改欄位位置,需要用到ALTERTABLE語句,輸入語句如下:

mysql> ALTER TABLE employees MODIFY mobile VARCHAR(25)AFTER officeCode;

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0  Warnings: 0

結果顯示執行成功,使用DESC檢視修改後的結果如下:

mysql>DESC employees;

+----------------------+--------------+--------+-------+---------+--------------------+

| Field           | Type     | Null  | Key | Default |Extra          |

+----------------------+--------------+--------+-------+---------+--------------------+

| employeeNumber | int(11)    | NO   | PRI  | NULL | auto_increment |

| lastName       |varchar(50)  | NO   |    | NULL |              |

| firstName      |varchar(50)  | NO   |      | NULL|              |

| officeCode     |int(10)      | NO   | MUL | NULL |              |

| mobile        | varchar(25) | NO   |      | NULL |             |

| jobTitle        | varchar(50) | NO   |     | NULL |              |

| employee _birth | datetime    | YES  |     | NULL |              |

| note           |varchar(255) | YES  |     | NULL |              |

| sex            | varchar(5)  | YES |     | NULL |              |

+--------------------+----------------+--------+-------+---------+--------------------+

9 rows in set (0.00 sec)

可以看到,mobile欄位已經插入到officeCode欄位的後面。

步驟6:將表employees的birth欄位改名為employee_birth。

修改欄位名,需要用到ALTERTABLE語句,輸入語句如下:

ALTER TABLE employees CHANGE birth employee_birthDATETIME;

Query OK, 0 rows affected (0.02 sec)

Records: 0 Duplicates: 0  Warnings: 0

結果顯示執行成功,使用DESC檢視修改後的結果如下:

mysql>DESC employees;

+----------------------+--------------+--------+-------+---------+--------------------+

| Field           | Type     | Null  | Key | Default |Extra          |

+----------------------+--------------+--------+-------+---------+--------------------+

| employeeNumber | int(11)    | NO   | PRI  | NULL | auto_increment |

| lastName       |varchar(50)  | NO   |    | NULL |              |

| firstName      |varchar(50)  | NO   |      | NULL|              |

| mobile         |varchar(25)  | NO   |    | NULL |              |

| officeCode     |int(10)      | NO   | MUL | NULL |              |

| jobTitle        | varchar(50) | NO   |     | NULL |              |

| employee _birth |datetime   | YES  |     |NULL |              |

| note           |varchar(255) | YES  |     | NULL |              |

| sex            | varchar(5)   | YES |     | NULL |              |

+--------------------+----------------+--------+-------+---------+--------------------+

9 rows in set (0.00 sec)

可以看到,表中只有employee_birth欄位,已經沒有名稱為birth的欄位了,修改名稱成功。

步驟7:修改sex欄位,資料型別為CHAR(1),非空約束。

修改欄位資料型別,需要用到ALTERTABLE語句,輸入語句如下:

mysql>ALTER TABLE employees MODIFY sex CHAR(1)NOT NULL;

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0  Warnings: 0

結果顯示執行成功,使用DESC檢視修改後的結果如下:

mysql>DESC employees;

+----------------------+--------------+--------+-------+---------+--------------------+

| Field           | Type     | Null  | Key | Default |Extra          |

+----------------------+--------------+--------+-------+---------+--------------------+

| employeeNumber | int(11)    | NO   | PRI  | NULL | auto_increment |

| lastName       |varchar(50)  | NO   |    | NULL |              |

| firstName      |varchar(50)  | NO   |      | NULL|              |

| mobile         |varchar(25)  | NO   |    | NULL |              |

| officeCode     |int(10)      | NO   | MUL | NULL |              |

| jobTitle        | varchar(50) | NO   |     | NULL |              |

| employee _birth | datetime    | YES  |     |NULL |              |

| note           |varchar(255) | YES  |     | NULL |              |

| sex            | char(1)     |  NO |     | NULL |              |

+--------------------+----------------+--------+-------+---------+--------------------+

9 rows in set (0.00 sec)

執行結果可以看到,sex欄位的資料型別由前面的VARCHAR(5)修改為CHAR(1),且其Null列顯示為NO,表示該列不允許空值,修改成功。

步驟8:刪除欄位note。

刪除欄位,需要用到ALTER TABLE語句,輸入語句如下:

mysql> ALTER TABLE employees DROP note;

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0

結果顯示執行語句成功,使用DESCemployees;檢視語句執行後的結果:

mysql> desc employees;

+----------------------+--------------+--------+-------+---------+--------------------+

| Field           | Type     | Null  | Key | Default |Extra          |

+----------------------+--------------+--------+-------+---------+--------------------+

|employeeNumber | int(11)    | NO   | PRI  | NULL | auto_increment |

| lastName       |varchar(50)  | NO   |    | NULL |              |

| firstName      |varchar(50)  | NO   |      | NULL|              |

| mobile         |varchar(25)  | NO   |    | NULL |              |

| officeCode     |int(10)      | NO   | MUL | NULL |              |

| jobTitle        | varchar(50) | NO   |     | NULL |              |

| employee _birth | datetime    | YES  |     |NULL |              |

| sex            | char(1)     |  NO |     | NULL |              |

+--------------------+----------------+--------+-------+---------+--------------------+

8 rows in set (0.00 sec)

可以看到,DESC語句返回了8個列欄位,note欄位已經不在表結構中,刪除欄位成功。

步驟9:增加欄位名favoriate_activity,資料型別為VARCHAR(100)。

增加欄位,需要用到ALTERTABLE語句,輸入語句如下:

mysql> ALTER TABLE employees ADD favoriate_a