2020重新出發(fā)鼎姊,MySql基礎(chǔ)相寇,MySql表的基本操作

@[toc]

MySQL數(shù)據(jù)表的基本操作

數(shù)據(jù)表是數(shù)據(jù)庫的重要組成部分唤衫,每一個(gè)數(shù)據(jù)庫都是由若干個(gè)數(shù)據(jù)表組成的战授。換句話說植兰,沒有數(shù)據(jù)表就無法在數(shù)據(jù)庫中存放數(shù)據(jù)废境。

比如噩凹,在電腦中創(chuàng)建一個(gè)空文件夾驮宴,如果要把“Hello C語言中文網(wǎng)”存放到文件夾中堵泽,必須把它寫在 Word 文檔迎罗、記事本或其它能存放文本的文檔中纹安。這里的空文件夾就相當(dāng)于數(shù)據(jù)庫砂豌,存放文本的文檔就相當(dāng)于數(shù)據(jù)表咪笑。

數(shù)據(jù)表的基本操作娄涩,主要包括創(chuàng)建數(shù)據(jù)表扬虚、查看數(shù)據(jù)表結(jié)構(gòu)辜昵、修改數(shù)據(jù)表和刪除數(shù)據(jù)表等堪置。

MySQL創(chuàng)建數(shù)據(jù)表

在創(chuàng)建數(shù)據(jù)庫之后舀锨,接下來就要在數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表坎匿。所謂創(chuàng)建數(shù)據(jù)表告私,指的是在已經(jīng)創(chuàng)建的數(shù)據(jù)庫中建立新表驻粟。

創(chuàng)建數(shù)據(jù)表的過程是規(guī)定數(shù)據(jù)列的屬性的過程格嗅,同時(shí)也是實(shí)施數(shù)據(jù)完整性(包括實(shí)體完整性、引用完整性和域完整性)約束的過程襟衰。

基本語法

在 MySQL中瀑晒,可以使用 CREATE TABLE 語句創(chuàng)建表苔悦。其語法格式為:

CREATE TABLE <表名> ([表定義選項(xiàng)])[表選項(xiàng)][分區(qū)選項(xiàng)];

其中玖详,[表定義選項(xiàng)]的格式為:

<列名1> <類型1> [,…] <列名n> <類型n>

CREATE TABLE 命令語法比較多蟋座,其主要是由表創(chuàng)建定義(create-definition)脚牍、表選項(xiàng)(table-options)和分區(qū)選項(xiàng)(partition-options)所組成的诸狭。

這里首先描述一個(gè)簡(jiǎn)單的新建表的例子,然后重點(diǎn)介紹 CREATE TABLE 命令中的一些主要的語法知識(shí)點(diǎn)芹彬。

CREATE TABLE 語句的主要語法及使用說明如下:

  • CREATE TABLE:用于創(chuàng)建給定名稱的表庵芭,必須擁有表CREATE的權(quán)限。
  • <表名>:指定要?jiǎng)?chuàng)建表的名稱雀监,在 CREATE TABLE 之后給出双吆,必須符合標(biāo)識(shí)符命名規(guī)則。表名稱被指定為 db_name.tbl_name会前,以便在特定的數(shù)據(jù)庫中創(chuàng)建表好乐。無論是否有當(dāng)前數(shù)據(jù)庫,都可以通過這種方式創(chuàng)建瓦宜。在當(dāng)前數(shù)據(jù)庫中創(chuàng)建表時(shí),可以省略 db-name淮蜈。如果使用加引號(hào)的識(shí)別名侧蘸,則應(yīng)對(duì)數(shù)據(jù)庫和表名稱分別加引號(hào)晌坤。例如,'mydb'.'mytbl' 是合法的,但 'mydb.mytbl' 不合法柬讨。
  • <表定義選項(xiàng)>:表創(chuàng)建定義境输,由列名(col_name)、列的定義(column_definition)以及可能的空值說明、完整性約束或表索引組成。
  • 默認(rèn)的情況是,表被創(chuàng)建到當(dāng)前的數(shù)據(jù)庫中。若表已存在戳晌、沒有當(dāng)前數(shù)據(jù)庫或者數(shù)據(jù)庫不存在,則會(huì)出現(xiàn)錯(cuò)誤。

注意:使用 CREATE TABLE 創(chuàng)建表時(shí)舌涨,必須指定以下信息:

  • 要?jiǎng)?chuàng)建的表的名稱不區(qū)分大小寫,不能使用SQL語言中的關(guān)鍵字,如DROP、ALTER、INSERT等。
  • 數(shù)據(jù)表中每個(gè)列(字段)的名稱和數(shù)據(jù)類型,如果創(chuàng)建多個(gè)列,要用逗號(hào)隔開。

注意:在指定的數(shù)據(jù)庫中創(chuàng)建表,數(shù)據(jù)表屬于數(shù)據(jù)庫,在創(chuàng)建數(shù)據(jù)表之前,應(yīng)使用語句“USE<數(shù)據(jù)庫>”指定操作在哪個(gè)數(shù)據(jù)庫中進(jìn)行,如果沒有選擇數(shù)據(jù)庫,就會(huì)拋出 No database selected 錯(cuò)誤。

MySQL 修改數(shù)據(jù)表

修改數(shù)據(jù)表的前提是數(shù)據(jù)庫中已經(jīng)存在該表傍菇。修改表指的是修改數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)。修改數(shù)據(jù)表的操作也是數(shù)據(jù)庫管理中必不可少的咐低,就像畫素描一樣见擦,畫多了可以用橡皮擦掉,畫少了可以用筆加上羹令。

不了解如何修改數(shù)據(jù)表鲤屡,就相當(dāng)于是我們只要畫錯(cuò)了就要扔掉重畫酒来,這樣就增加了不必要的成本。

在 MySQL 中可以使用 ALTER TABLE 語句來改變?cè)斜淼慕Y(jié)構(gòu)肪凛,例如增加或刪減列、更改原有列類型、重新命名列或表等。

其語法格式如下:

ALTER TABLE <表名> [修改選項(xiàng)]

修改選項(xiàng)的語法格式如下:

{ ADD COLUMN <列名> <類型>
| CHANGE COLUMN <舊列名> <新列名> <新列類型>
| ALTER COLUMN <列名> { SET DEFAULT <默認(rèn)值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <類型>
| DROP COLUMN <列名>
| RENAME TO <新表名>
| CHARACTER SET <字符集名>
| COLLATE <校對(duì)規(guī)則名> }

修改表名

MySQL 通過 ALTER TABLE 語句來實(shí)現(xiàn)表名的修改郁惜,語法規(guī)則如下:

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

其中恨樟,TO 為可選參數(shù)半醉,使用與否均不影響結(jié)果。

注意:修改表名并不修改表的結(jié)構(gòu)劝术,因此修改名稱后的表和修改名稱前的表的結(jié)構(gòu)是相同的缩多。用戶可以使用 DESC 命令查看修改后的表結(jié)構(gòu),

修改表字符集

MySQL 通過 ALTER TABLE 語句來實(shí)現(xiàn)表字符集的修改养晋,語法規(guī)則如下:

ALTER TABLE 表名 [DEFAULT] CHARACTER SET <字符集名> [DEFAULT] COLLATE <校對(duì)規(guī)則名>;

其中衬吆,DEFAULT 為可選參數(shù),使用與否均不影響結(jié)果绳泉。

MySQL修改/刪除字段

修改字段名稱

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

ALTER TABLE <表名> CHANGE <舊字段名> <新字段名> <新數(shù)據(jù)類型>逊抡;

其中:

  • 舊字段名:指修改前的字段名;
  • 新字段名:指修改后的字段名零酪;
  • 新數(shù)據(jù)類型:指修改后的數(shù)據(jù)類型冒嫡,如果不需要修改字段的數(shù)據(jù)類型,可以將新數(shù)據(jù)類型設(shè)置成與原來一樣四苇,但數(shù)據(jù)類型不能為空孝凌。

例子:使用 ALTER TABLE 修改表 tb_emp1 的結(jié)構(gòu),將 col1 字段名稱改為 col3月腋,同時(shí)將數(shù)據(jù)類型變?yōu)?CHAR(30)蟀架,SQL 語句和運(yùn)行結(jié)果如下所示瓣赂。

mysql> ALTER TABLE tb_emp1
    -> CHANGE col1 col3 CHAR(30);
Query OK, 0 rows affected (0.76 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> DESC tb_emp1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| col3   | char(30)    | YES  |     | NULL    |       |
| id     | int(11)     | YES  |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float        | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

CHANGE 也可以只修改數(shù)據(jù)類型,實(shí)現(xiàn)和 MODIFY 同樣的效果片拍,方法是將 SQL 語句中的“新字段名”和“舊字段名”設(shè)置為相同的名稱煌集,只改變“數(shù)據(jù)類型”。

注意:由于不同類型的數(shù)據(jù)在機(jī)器中的存儲(chǔ)方式及長(zhǎng)度并不相同捌省,修改數(shù)據(jù)類型可能會(huì)影響數(shù)據(jù)表中已有的數(shù)據(jù)記錄苫纤,因此,當(dāng)數(shù)據(jù)表中已經(jīng)有數(shù)據(jù)時(shí)所禀,不要輕易修改數(shù)據(jù)類型方面。

修改字段數(shù)據(jù)類型

修改字段的數(shù)據(jù)類型就是把字段的數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型。在 MySQL 中修改字段數(shù)據(jù)類型的語法規(guī)則如下:

ALTER TABLE <表名> MODIFY <字段名> <數(shù)據(jù)類型>

其中:

  • 表名:指要修改數(shù)據(jù)類型的字段所在表的名稱色徘;
  • 字段名:指需要修改的字段恭金;
  • 數(shù)據(jù)類型:指修改后字段的新數(shù)據(jù)類型。

例子:使用 ALTER TABLE 修改表 tb_emp1 的結(jié)構(gòu)褂策,將 name 字段的數(shù)據(jù)類型由 VARCHAR(22) 修改成 VARCHAR(30)横腿,SQL 語句和運(yùn)行結(jié)果如下所示。

mysql> ALTER TABLE tb_emp1
    -> MODIFY name VARCHAR(30);
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> DESC tb_emp1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| col1   | int(11)     | YES  |     | NULL    |       |
| id     | int(11)     | YES  |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| col2   | int(11)     | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float        | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

語句執(zhí)行后斤寂,發(fā)現(xiàn)表 tb_emp1 中 name 字段的數(shù)據(jù)類型已經(jīng)修改成 VARCHAR(30)耿焊,修改成功。

刪除字段

刪除字段是將數(shù)據(jù)表中的某個(gè)字段從表中移除遍搞,語法格式如下:

ALTER TABLE <表名> DROP <字段名>罗侯;

其中,“字段名”指需要從表中刪除的字段的名稱溪猿。

例子:使用 ALTER TABLE 修改表 tb_emp1 的結(jié)構(gòu)钩杰,刪除 col2 字段,SQL 語句和運(yùn)行結(jié)果如下所示诊县。

mysql> ALTER TABLE tb_emp1
    -> DROP col2;
Query OK, 0 rows affected (0.53 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC tb_emp1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| col1   | int(11)     | YES  |     | NULL    |       |
| id     | int(11)     | YES  |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float        | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

MySQL刪除數(shù)據(jù)表

在 MySQL 數(shù)據(jù)庫中讲弄,對(duì)于不再需要的數(shù)據(jù)表,我們可以將其從數(shù)據(jù)庫中刪除依痊。

在刪除表的同時(shí)避除,表的結(jié)構(gòu)和表中所有的數(shù)據(jù)都會(huì)被刪除,因此在刪除數(shù)據(jù)表之前最好先備份胸嘁,以免造成無法挽回的損失瓶摆。

基本語法

使用 DROP TABLE 語句可以刪除一個(gè)或多個(gè)數(shù)據(jù)表,語法格式如下:

DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]

對(duì)語法格式的說明如下:

  • 表名1, 表名2, 表名3 ...表示要被刪除的數(shù)據(jù)表的名稱性宏。DROP TABLE 可以同時(shí)刪除多個(gè)表赏壹,只要將表名依次寫在后面,相互之間用逗號(hào)隔開即可衔沼。
  • IF EXISTS 用于在刪除數(shù)據(jù)表之前判斷該表是否存在蝌借。如果不加 IF EXISTS,當(dāng)數(shù)據(jù)表不存在時(shí) MySQL 將提示錯(cuò)誤指蚁,中斷 SQL 語句的執(zhí)行菩佑;加上 IF EXISTS 后,當(dāng)數(shù)據(jù)表不存在時(shí) SQL 語句可以順利執(zhí)行凝化,但是會(huì)發(fā)出警告(warning)稍坯。

兩點(diǎn)注意:

  • 用戶必須擁有執(zhí)行 DROP TABLE 命令的權(quán)限,否則數(shù)據(jù)表不會(huì)被刪除搓劫。
  • 表被刪除時(shí)瞧哟,用戶在該表上的權(quán)限不會(huì)自動(dòng)刪除。

例子:選擇數(shù)據(jù)庫 test_db枪向,創(chuàng)建 tb_emp3 數(shù)據(jù)表勤揩,輸入的 SQL 語句和運(yùn)行結(jié)果如下所示。

mysql> USE test_db;
Database changed
mysql> CREATE TABLE tb_emp3
    -> (
    -> id INT(11),
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT
    -> );
Query OK, 0 rows affected (0.27 sec)
mysql> SHOW TABLES;
+--------------------+
| Tables_in_test_db  |
+--------------------+
| tb_emp2            |
| tb_emp3            |
+--------------------+
2 rows in set (0.00 sec)

由運(yùn)行結(jié)果可以看出秘蛔,test_tb 數(shù)據(jù)庫中有 tb_emp2 和 tb_emp3 兩張數(shù)據(jù)表陨亡。

我們來刪除數(shù)據(jù)表 tb_emp3,輸入的 SQL 語句和運(yùn)行結(jié)果如下所示:

mysql> DROP TABLE tb_emp3;
Query OK, 0 rows affected (0.22 sec)
mysql> SHOW TABLES;
+--------------------+
| Tables_in_test_db  |
+--------------------+
| tb_emp2            |
+--------------------+
1 rows in set (0.00 sec)

執(zhí)行結(jié)果可以看到深员,test_db 數(shù)據(jù)庫的數(shù)據(jù)表列表中已經(jīng)不存在名稱為 tb_emp3 的表负蠕,刪除操作成功。

MySQL刪除被其它表關(guān)聯(lián)的主表

數(shù)據(jù)表之間經(jīng)常存在外鍵關(guān)聯(lián)的情況倦畅,這時(shí)如果直接刪除父表遮糖,會(huì)破壞數(shù)據(jù)表的完整性,也會(huì)刪除失敗叠赐。

刪除父表有以下兩種方法:

  • 先刪除與它關(guān)聯(lián)的子表欲账,再刪除父表;但是這樣會(huì)同時(shí)刪除兩個(gè)表中的數(shù)據(jù)燎悍。
  • 將關(guān)聯(lián)表的外鍵約束取消敬惦,再刪除父表;適用于需要保留子表的數(shù)據(jù)谈山,只刪除父表的情況俄删。

如何取消關(guān)聯(lián)表的外鍵約束并刪除主表,也就是上面所說的刪除父表的第二種方法奏路。

在數(shù)據(jù)庫中創(chuàng)建兩個(gè)關(guān)聯(lián)表畴椰。創(chuàng)建表 tb_emp4 的 SQL 語句如下:

CREATE TABLE tb_emp4
(
id INT(11) PRIMARY KEY,
name VARCHAR(22),
location VARCHAR (50)
);

接下來創(chuàng)建表 tb_emp5,SQL 語句如下:

CREATE TABLE tb_emp5
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
CONSTRAINT fk_emp4_emp5 FOREIGN KEY (deptId) REFERENCES tb_emp4(id)
);

使用 SHOW CREATE TABLE 命令查看表 tb_ emp5 的外鍵約束鸽粉,SQL 語句和運(yùn)行結(jié)果如下:

mysql> SHOW CREATE TABLE tb_emp5\G;
*************************** 1. row ***************************
       Table: tb_emp5
Create Table: CREATE TABLE `tb_emp5` (
  `id` int(11) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_emp4_emp5` (`deptId`),
  CONSTRAINT `fk_emp4_emp5` FOREIGN KEY (`deptId`) REFERENCES `tb_emp4` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

由運(yùn)行結(jié)果可以看出斜脂,tb_emp5 表為子表,具有名稱為 fk_emp4_emp5 的外鍵約束触机;tb_emp4 為父表帚戳,其主鍵 id 被子表 tb_ emp5 所關(guān)聯(lián)玷或。

刪除被數(shù)據(jù)表 tb_emp5 關(guān)聯(lián)的數(shù)據(jù)表 tb_emp4,SQL 語句如下:

mysql> DROP TABLE tb_emp4;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

由運(yùn)行結(jié)果可以看出片任,當(dāng)主表在存在外鍵約束時(shí)偏友,不能被直接刪除。

下面解除子表 tb_emp5 的外鍵約束对供,SQL語句和運(yùn)行結(jié)果如下:

mysql> ALTER TABLE tb_emp5 DROP FOREIGN KEY fk_emp4_emp5;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

語句成功執(zhí)行后位他,會(huì)取消表 tb_emp4 和表 tb_emp5 之間的關(guān)聯(lián)關(guān)系。

解除關(guān)聯(lián)關(guān)系后产场,可以使用 DROP TABLE 語句直接刪除父表 tb_emp4鹅髓,SQL 語句如下:

DROP TABLE tb_emp4;

最后通過 SHOW TABLES 命令查看數(shù)據(jù)表列表,如下所示:

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tb_emp5        |
| temp           |
+----------------+
2 rows in set (0.00 sec)

可以發(fā)現(xiàn)京景,數(shù)據(jù)庫列表中已經(jīng)不存在名稱為 tb_emp4 的表窿冯,刪除成功。

MySQL查看表結(jié)構(gòu)命令

創(chuàng)建完數(shù)據(jù)表之后醋粟,經(jīng)常需要查看表結(jié)構(gòu)(表信息)靡菇。在 MySQL 中,可以使用 DESCRIBESHOW CREATE TABLE 命令來查看數(shù)據(jù)表的結(jié)構(gòu)米愿。

DESCRIBE

DESCRIBE/DESC 語句會(huì)以表格的形式來展示表的字段信息厦凤,包括字段名、字段數(shù)據(jù)類型育苟、是否為主鍵较鼓、是否有默認(rèn)值等,語法格式如下:

DESCRIBE <表名>;

或簡(jiǎn)寫成:

DESC <表名>;

分別使用 DESCRIBE 和 DESC 查看表 tb_emp1 的表結(jié)構(gòu)违柏,SQL 語句和運(yùn)行結(jié)果如下:

mysql> DESCRIBE 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    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

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    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

其中博烂,各個(gè)字段的含義如下:

  • Null:表示該列是否可以存儲(chǔ) NULL 值。
  • Key:表示該列是否已編制索引漱竖。PRI 表示該列是表主鍵的一部分禽篱,UNI 表示該列是 UNIQUE 索引的一部分,MUL 表示在列中某個(gè)給定值允許出現(xiàn)多次馍惹。
  • Default:表示該列是否有默認(rèn)值躺率,如果有,值是多少万矾。
  • Extra:表示可以獲取的與給定列有關(guān)的附加信息悼吱,如 AUTO_INCREMENT 等。

SHOW CREATE TABLE

SHOW CREATE TABLE 命令會(huì)以 SQL 語句的形式來展示表信息良狈。和 DESCRIBE 相比后添,SHOW CREATE TABLE 展示的內(nèi)容更加豐富,它可以查看表的存儲(chǔ)引擎和字符編碼薪丁;另外遇西,你還可以通過\g或者\G參數(shù)來控制展示格式馅精。

SHOW CREATE TABLE 的語法格式如下:

SHOW CREATE TABLE <表名>;

在 SHOW CREATE TABLE 語句的結(jié)尾處(分號(hào)前面)添加\g或者\G參數(shù)可以改變展示形式。

使用 SHOW CREATE TABLE 語句查看表 tb_emp1 的詳細(xì)信息努溃,一次使用\g結(jié)尾硫嘶,一次不使用:

mysql> SHOW CREATE TABLE tb_emp1;
+---------+------------------------------------------------+
| Table   | Create Table                                   |
+---------+------------------------------------------------+
| tb_emp1 | CREATE TABLE `tb_emp1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(25) DEFAULT NULL,
  `salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
+---------+------------------------------------------------+
1 row in set (0.01 sec)

mysql> SHOW CREATE TABLE tb_emp1 \g;
+---------+------------------------------------------------+
| Table   | Create Table                                   |
+---------+------------------------------------------------+
| tb_emp1 | CREATE TABLE `tb_emp1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(25) DEFAULT NULL,
  `salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
+---------+------------------------------------------------+
1 row in set (0.00 sec)

SHOW CREATE TABLE 使用\G結(jié)尾的 SQL 語句和運(yùn)行結(jié)果如下:

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=gb2312
1 row in set (0.03 sec)

MySQL數(shù)據(jù)表添加字段

MySQL 數(shù)據(jù)表是由行和列構(gòu)成的,通常把表的“列”稱為字段(Field)梧税,把表的“行”稱為記錄(Record)。隨著業(yè)務(wù)的變化称近,可能需要在已有的表中添加新字段第队。

MySQL 允許在開頭、中間和結(jié)尾處添加字段刨秆。

在末尾添加字段

一個(gè)完整的字段包括字段名凳谦、數(shù)據(jù)類型和約束條件。MySQL 添加字段的語法格式如下:

ALTER TABLE <表名> ADD <新字段名><數(shù)據(jù)類型>[約束條件];

對(duì)語法格式的說明如下:

  • <表名> 為數(shù)據(jù)表的名字衡未;
  • <新字段名> 為所要添加的字段的名字尸执;
  • <數(shù)據(jù)類型> 為所要添加的字段能存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)類型;
  • [約束條件] 是可選的缓醋,用來對(duì)添加的字段進(jìn)行約束如失。

這種語法格式默認(rèn)在表的最后位置(最后一列的后面)添加新字段。

例子:在 test 數(shù)據(jù)庫中新建 student 數(shù)據(jù)表送粱,SQL 語句和運(yùn)行結(jié)果如下:

mysql> USE test;
Database changed
mysql> CREATE TABLE student (
    -> id INT(4),
    -> name VARCHAR(20),
    -> sex CHAR(1));
Query OK, 0 rows affected (0.09 sec)                           

使用 DESC 查看 student 表結(jié)構(gòu)褪贵,SQL 語句和運(yùn)行結(jié)果如下:

mysql> DESC student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

使用 ALTER TABLE 語句添加一個(gè) INT 類型的字段 age,SQL 語句和運(yùn)行結(jié)果如下:

mysql> ALTER TABLE student ADD age INT(4);
Query OK, 0 rows affected (0.16 sec)
Records: 0  Duplicates: 0  Warnings: 0

使用 DESC 查看 student 表結(jié)構(gòu)抗俄,檢驗(yàn) age 字段是否添加成功脆丁。SQL 語句和運(yùn)行結(jié)果如下:

mysql> DESC student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
| age   | int(4)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

由運(yùn)行結(jié)果可以看到,student 表已經(jīng)添加了 age 字段动雹,且該字段在表的最后一個(gè)位置槽卫,添加字段成功。

在開頭添加字段

MySQL 默認(rèn)在表的最后位置添加新字段胰蝠,如果希望在開頭位置(第一列的前面)添加新字段歼培,那么可以使用 FIRST 關(guān)鍵字,語法格式如下:

ALTER TABLE <表名> ADD <新字段名> <數(shù)據(jù)類型> [約束條件] FIRST;

FIRST 關(guān)鍵字一般放在語句的末尾姊氓。

例子:使用 ALTER TABLE 語句在表的第一列添加 INT 類型的字段 stuId丐怯,SQL 語句和運(yùn)行結(jié)果如下所示。

mysql> ALTER TABLE student ADD stuId INT(4) FIRST;
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| stuId | int(4)      | YES  |     | NULL    |       |
| id    | int(4)      | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
| age   | int(4)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

由運(yùn)行結(jié)果可以看到翔横,student 表中已經(jīng)添加了 stuId 字段读跷,且該字段在表中的第一個(gè)位置,添加字段成功禾唁。

在中間位置添加字段

MySQL 除了允許在表的開頭位置和末尾位置添加字段外效览,還允許在中間位置(指定的字段之后)添加字段无切,此時(shí)需要使用 AFTER 關(guān)鍵字,語法格式如下:

ALTER TABLE <表名> ADD <新字段名> <數(shù)據(jù)類型> [約束條件] AFTER <已經(jīng)存在的字段名>;

AFTER 的作用是將新字段添加到某個(gè)已有字段后面丐枉。

注意哆键,只能在某個(gè)已有字段的后面添加新字段,不能在它的前面添加新字段瘦锹。

例子:使用 ALTER TABLE 語句在 student 表中添加名為 stuno籍嘹,數(shù)據(jù)類型為 INT 的字段,stuno 字段位于 name 字段的后面弯院。SQL 語句和運(yùn)行結(jié)果如下:

mysql> ALTER TABLE student ADD stuno INT(11) AFTER name;
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> DESC student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| stuId | int(4)      | YES  |     | NULL    |       |
| id    | int(4)      | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| stuno | int(11)     | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
| age   | int(4)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

由運(yùn)行結(jié)果可以看到辱士,student 表中已經(jīng)添加了 stuId 字段,且該字段在 name 字段后面的位置听绳,添加字段成功颂碘。

如何將SQL語句映射為文件操作

查詢數(shù)據(jù)表

前面介紹過,在 MySQL 中無論哪種存儲(chǔ)引擎的表都會(huì)有一個(gè) .frm 文件來保存數(shù)據(jù)表的結(jié)構(gòu)定義椅挣。所以头岔,執(zhí)行 SHOW TABLES; 語句相當(dāng)于列出數(shù)據(jù)庫目錄中所有 .frm 文件的基本名,所得到的結(jié)果是相同的鼠证。

有些數(shù)據(jù)庫系統(tǒng)使用注冊(cè)表來記錄某數(shù)據(jù)庫里的所有數(shù)據(jù)表峡竣,但 MySQL 沒有這樣做,因?yàn)槊停琈ySQL 數(shù)據(jù)目錄的層次結(jié)構(gòu)已經(jīng)把“注冊(cè)表”隱藏在其中了澎胡。

創(chuàng)建數(shù)據(jù)表

創(chuàng)建數(shù)據(jù)表時(shí),需要執(zhí)行 CREATE TABLE 語句定義數(shù)據(jù)表的結(jié)構(gòu)娩鹉。無論是哪一種存儲(chǔ)引擎攻谁,MySQL 服務(wù)器都將創(chuàng)建一個(gè) .frm 文件來保存數(shù)據(jù)表的結(jié)構(gòu)定義的內(nèi)部編碼。L 服務(wù)器還會(huì)根據(jù)指定數(shù)據(jù)表的具體類型創(chuàng)建出其他必要的文件弯予。

  • 例如戚宦,它將為一個(gè) MyISAM 數(shù)據(jù)表創(chuàng)建出一個(gè) .MYD 數(shù)據(jù)文件和一個(gè) .MYI 索引文件;為一個(gè) MERGE 數(shù)據(jù)表創(chuàng)建出一個(gè) .mgr 數(shù)據(jù)/索引文件锈嫩。

對(duì)于 InnoDB 數(shù)據(jù)表受楼,InnoDB 處理程序?qū)⒃?InnoDB 表空間里為數(shù)據(jù)表初始化一些數(shù)據(jù)和索引信息。

更新數(shù)據(jù)表

當(dāng)執(zhí)行 ALTER TABLE 語句時(shí)呼寸,MySQL 服務(wù)器將對(duì)相對(duì)應(yīng)數(shù)據(jù)表的 .frm 文件重新進(jìn)行編碼艳汽,來表明數(shù)據(jù)表的結(jié)構(gòu)性變化,還要對(duì)有關(guān)的數(shù)據(jù)文件和索引文件的內(nèi)容進(jìn)行相應(yīng)的修改对雪。

CREATE INDEX 和 DROP INDEX 等語句也是對(duì)相應(yīng)數(shù)據(jù)表的 .frm 文件重新進(jìn)行編碼河狐,因?yàn)?MySQL 服務(wù)器在內(nèi)部是把它們當(dāng)作等效的 ALTER TABLE 語句來處理的。改變 InnoDB 數(shù)據(jù)表的結(jié)構(gòu)會(huì)引起 InnoDB 處理程序修改 InnoDB 表空間中數(shù)據(jù)表的數(shù)據(jù),同時(shí)也對(duì)索引做出相應(yīng)的修改馋艺。

刪除數(shù)據(jù)表

DROP TABLE 語句是通過刪除該相應(yīng)數(shù)據(jù)表的各種有關(guān)文件而實(shí)現(xiàn)的栅干。

對(duì)于某些數(shù)據(jù)表類型,可以通過在相應(yīng)的數(shù)據(jù)庫目錄里刪除與數(shù)據(jù)表有關(guān)的各個(gè)文件的辦法來手動(dòng)刪除這個(gè)數(shù)據(jù)表捐祠。

  • 例如碱鳞,mydb 是當(dāng)前數(shù)據(jù)庫,mytb1 是一個(gè) MyISAM踱蛀、Archive 或 MERGE 類型的數(shù)據(jù)表窿给,那么 DROP TABLE mytb1 語句就大致等效于下面這兩條命令:
cd DATADIR(數(shù)據(jù)庫文件存放路徑)
rm -f mydb/mytb1.* 或 del mydb/mytb1.*

對(duì)于 InnoDB 數(shù)據(jù)表,因?yàn)樗哪承┙M成部分在文件系統(tǒng)里沒有實(shí)體性的文件代表星岗,所以沒有等效的文件系統(tǒng)命令填大。

  • 例如,InnoDB 數(shù)據(jù)表在文件系統(tǒng)里只有一個(gè)相應(yīng)的 .frm 文件俏橘,用文件系統(tǒng)級(jí)命令刪除這個(gè)文件后,該數(shù)據(jù)表在 InnoDB 表空間中對(duì)應(yīng)的數(shù)據(jù)和索引將沒有任何意義圈浇。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寥掐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子磷蜀,更是在濱河造成了極大的恐慌召耘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐隆,死亡現(xiàn)場(chǎng)離奇詭異污它,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庶弃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門衫贬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歇攻,你說我怎么就攤上這事固惯。” “怎么了缴守?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵葬毫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我屡穗,道長(zhǎng)贴捡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任村砂,我火速辦了婚禮烂斋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己源祈,他們只是感情好煎源,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著香缺,像睡著了一般手销。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上图张,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天锋拖,我揣著相機(jī)與錄音,去河邊找鬼祸轮。 笑死兽埃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的适袜。 我是一名探鬼主播柄错,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼苦酱!你這毒婦竟也來了售貌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤疫萤,失蹤者是張志新(化名)和其女友劉穎颂跨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扯饶,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恒削,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年渊涝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抬纸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亏娜。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恒傻,死狀恐怖捷绒,靈堂內(nèi)的尸體忽然破棺而出帮非,到底是詐尸還是另有隱情欧啤,我是刑警寧澤鼓择,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布脯爪,位于F島的核電站则北,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痕慢。R本人自食惡果不足惜尚揣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掖举。 院中可真熱鬧快骗,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藕溅,卻和暖如春匕得,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巾表。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工汁掠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人集币。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓考阱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親鞠苟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乞榨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355