MYSQL學習之路4(2)
資料表的基本操作2
(這裡的例子有用到前面1的)
2.檢視資料表結構
2.1查看錶基本結構語句DESCRIBE
DESCRIBE/DESC可以檢視欄位的資訊,其中包括:欄位名、欄位資料型別、是否為主鍵、是否有預設值等。語法規則:
DESCRIBE 表名;
或者簡寫為:DESC 表名;
例:分別使用DESCRIBE和DESC查看錶tb_dept3和特別tb_emp8的表結構。
檢視tb_dept3表結構:
mysql> DESCRIBE tb_dept3; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | YES | UNI | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.30 sec)
檢視tb_emp8表結構:
mysql> DESC tb_emp8; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(22) | NO | | NULL | | | deptId | int(11) | YES | MUL | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
其中,各個欄位的含義如下:
- NULL:表示該列是否可以儲存NULL值。
- Key:表示該列是否已編制索引。PRI表示該列是表主鍵的一部分;UNI表示該列是UNIQUE索引的一部分;MUL表示某個給定值允許出現多次。
- Default:表示該列是否有預設值,如果有的話預設值是多少。
- Extra:表示可以獲取的與給定列的附加資訊,例如AUTO_INCREMENT。
2.2查看錶詳細結構語句SHOW CREATE TABLE
其語法格式如下:SHOW CREATE TABLE<表名\G>;
此語句不僅可以檢視建立時候的詳細語句,而且還可以檢視儲存引擎和字元編碼。
如果不用\G引數,顯示的結果可能非常混亂,用了之後對心急的人好O(∩_∩)O哈哈
例:使用SHOW CREATE TABLE 查看錶tb_emp8的詳細資訊,語句如下:
mysql> SHOW CREATE TABLE tb_emp8;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp8 | CREATE TABLE `tb_emp8` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(22) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept5` (`deptId`),
CONSTRAINT `fk_emp_dept5` FOREIGN KEY (`deptId`) REFERENCES `tb_dept3` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
使用\G引數後,結果如下:;
mysql> SHOW CREATE TABLE tb_emp8\G;
*************************** 1. row ***************************
Table: tb_emp8
Create Table: CREATE TABLE `tb_emp8` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(22) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept5` (`deptId`),
CONSTRAINT `fk_emp_dept5` FOREIGN KEY (`deptId`) REFERENCES `tb_dept3` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
3.修改資料表
修改表:修改資料庫中已經存在的資料表的結構。
常用修改表的操作有:修改表名、修改欄位資料型別或欄位名、增加和刪除欄位、修改欄位的排列位置、更改表的儲存引擎、刪除表的外來鍵約束等。
3.1修改表名
MySQL通過ALTER TABLE語句來實現表名的修改,具體語法規則如下:ALTER TABLE <舊錶名> RENAME [TO] <新表名>;
執行修改表名操作之前要先檢視資料庫中所有的表:
mysql> SHOW TABLES;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1 |
| tb_dept2 |
| tb_dept3 |
| tb_emp5 |
| tb_emp6 |
| tb_emp7 |
| tb_emp8 |
+-------------------+
7 rows in set (0.05 sec)
下面使用ALTER TABLE將表tb_dept3改為tb_deptment3,SQL語句如下:
mysql> ALTER TABLE tb_dept3 RENAME tb_deptment3;
Query OK, 0 rows affected (0.37 sec)
執行之後檢查是否改名成功:
mysql> SHOW TABLES;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1 |
| tb_dept2 |
| tb_deptment3 |
| tb_emp5 |
| tb_emp6 |
| tb_emp7 |
| tb_emp8 |
+-------------------+
7 rows in set (0.00 sec)
但是修改表名並不會影響表的結構,可用DESC檢視:
mysql> DESC tb_deptment3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | YES | UNI | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.03 sec)
3.2修改欄位的資料型別
語法規則:ALTER TABLE <表名> MODIFY <欄位名> <資料型別>
其中,表名是要修改資料型別的欄位所在表的名稱;欄位名是需要修改的欄位;資料型別是修改後欄位的新資料型別。
例:將tb_dept1 中的name欄位的資料型別由VARCHAR(22)改為VARCHAR(25)。
在修改之前先使用DESC檢視tb_dept1表結構,結果如下:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.16 sec)
可以看到name欄位資料型別為VARCHAR(22),下面修改再檢視,SQL語句如下:
mysql> ALTER TABLE tb_dept1 MODIFY name VARCHAR(25);
Query OK, 0 rows affected (0.80 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
可見,修改已經成功。
3.3修改欄位名
MySQL中修改表字段名的語法規則:
ALTER TABLE <表名> CHANGE <舊欄位名> <新欄位名> <新資料型別>
注意:新資料型別不能為空,要想不改變則設定為與原來一樣即可!
例:將資料表tb_dept1中的location欄位名改為loc,資料型別保持不變,SQL語句如下:
mysql> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
當然,CHANGE也可以和MODIFY一樣只修改資料型別,只需把新欄位名設定為舊欄位名即可 。讀者可以試試,在這裡我不多加示範啦。
提示:修改資料型別的時候要相當謹慎,因為若表中已經有資料時可能會受到影響。
3.4新增欄位
新增欄位的語法格式如下:
ALTER TABLE <表名> ADD <新欄位名> <資料型別> [約束條件] [FIRST | AFTER 已存在欄位名]
其中,FIRST為可選引數,其作用是將新新增的欄位設定為表的第一個欄位;AFTER為可選引數,作用是將新新增的欄位新增到指定的“已存在欄位”的後面。如果沒有使用這兩個引數,則預設新增到資料表的最後列。
- 新增無完整性約束條件的欄位
例:在資料表tb_dept1中新增一個無完整性約束條件的INT型別的欄位manageId(部門經理編號),SQL語句如下:
ALTER TABLE tb_dept1 ADD manageId INT(10);
使用DESC檢視,可以看到:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.03 sec)
- 新增有完整性約束條件的欄位
例:在資料表tb_dept1中新增一個不能為空的VARCHAR(12)型別的欄位column1,SQL語句如下:
mysql> ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) NOT NULL;
Query OK, 0 rows affected (0.65 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC檢視有:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
- 在表的第一列新增一個欄位
例:在表tb_dept1中新增一個INT型別的欄位column2,SQL語句如下:
mysql> ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST;
Query OK, 0 rows affected (0.78 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC檢視有:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 在表的指定列之後新增一個欄位
例:在資料表tb_dept1中name列後新增一個INT型別的欄位column3,SQL語句如下:
mysql> ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name;
Query OK, 0 rows affected (0.90 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC有:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
可以看到tb_dept1中新增的欄位column3在name欄位後面。
3.5刪除欄位
刪除欄位的語法格式:
ALTER TABLE <表名> DROP <欄位名>;
例:刪除tb_dept1表中的欄位column2欄位:
mysql> ALTER TABLE tb_dept1 DROP column2;
Query OK, 0 rows affected (0.55 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
可以看到column2欄位已經被刪除成功。
3.6修改欄位的排列位置
通過ALTER TABLE改變表中欄位的相對位置,語法格式如下:
ALTER TABLE <表名> MODIFY <欄位1> <資料型別> FIRST | AFTER <欄位2>;
欄位一為要修改位置的欄位。
- 修改欄位為表的第一個欄位
例:將資料表tb_dept1中的column1修改為表的第一個欄位,SQL語句如下:
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST;
Query OK, 0 rows affected (0.66 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC 查看錶tb_dept1,發現移動成功:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| column1 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 修改欄位到表的指定列之後
例:將資料表tb_dept1中的column1欄位插入到loc欄位後面,SQL語句如下:
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER loc;
Query OK, 0 rows affected (0.51 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
3.7更改表的儲存引擎
MySQL中主要儲存引擎:MyISAM、InnoDB、MERORY(HEAP)、BDB、FEDERATED等。
可以用SHOW ENGINES;
語句檢視系統支援的儲存引擎。
更改表的儲存引擎的語法格式如下:
ALTER TABLE <表名> ENGINE=<更改後的儲存引擎名>;
例:將資料表tb_deptment3的儲存引擎修改為MyIASM。
修改前先查看錶tb_deptment3當前的儲存引擎:
mysql> SHOW CREATE TABLE tb_deptment3\G
*************************** 1. row ***************************
Table: tb_deptment3
Create Table: CREATE TABLE `tb_deptment3` (
`id` int(11) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `STH` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
(注意:這裡如果出現ERROR: No query specified
的錯誤,表示你的分號重複了,如果使用了\G則其代表了一個分號,所以\G後面可不帶分號。)
可以看到表tb_deptment3當前的儲存引擎為 ENGINE=InnoDB,下面修改儲存引擎型別,SQL語句如下:
這裡我一開始嘗試的時候出現了錯誤:
mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
這為什麼會出錯呢?因為有外來鍵約束束縛了tb_deptment3,而MyISAM儲存引擎不支援外來鍵,所以不能更改儲存引擎。要想將儲存引擎InnoDB更改為MyISAM儲存引擎只能將外來鍵關係先刪除了。
mysql> ALTER TABLE tb_emp5 DROP FOREIGN KEY fk_emp_dept1;
Query OK, 0 rows affected (0.37 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_emp8 DROP FOREIGN KEY fk_emp_dept5;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_emp6 DROP FOREIGN KEY fk_emp_dept2;
Query OK, 0 rows affected (0.19 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_emp7 DROP FOREIGN KEY fk_emp_dept3;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
上述是我前面加了外來鍵約束的表,所以刪起來還得回去看記錄,如果忘記了外來鍵約束名稱可以使用SHOW CREATE TABLE <表名> \G
檢視。
當將所有外來鍵關係刪除之後:
mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM;
Query OK, 0 rows affected (0.65 sec)
Records: 0 Duplicates: 0 Warnings: 0
再次查看錶tb_deptment3的儲存引擎,可以看到儲存引擎更改成功了:
mysql> SHOW CREATE TABLE tb_deptment3\G
*************************** 1. row ***************************
Table: tb_deptment3
Create Table: CREATE TABLE `tb_deptment3` (
`id` int(11) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `STH` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.10 sec)
3.8刪除表的外來鍵約束
在3.7的時候由於外來鍵約束的存在讓我們更改引擎變得麻煩,我們刪除了外來鍵約束,在這一過程中大概也明白瞭如何刪除外來鍵約束。
其語法格式為:ALTER TABLE <表名> DROP FOREIGN KEY <外來鍵約束名>
例子前面已經展示,這裡不多做說明。