1. 程式人生 > >MYSQL學習之路4(2)

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 <外來鍵約束名>
例子前面已經展示,這裡不多做說明。