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