您好,登錄后才能下訂單哦!
1、如何創建表結構?
語法格式如下:
CREATE TABLE [IF NOT EXISTS] 表名 ( 字段1 數據類型 [完整性約束條件], 字段2 數據類型 [完整性約束條件], .... 字段n 數據類型 [完整性約束條件] );
說明 :[IF NOT EXISTS] 為可選字段,加上此選項后如果創建的數據表已經存在,不會報錯,只會出現警告信息,而不會報錯,如果不加此選項會出現報錯信息。創建的表的名字不能為SQL語言的關鍵字如create、updata和order等,每個字段的結束后用逗號隔開,最后一個字段不需要加逗號。
完整性約束條件也是可選字段,是對字段進行限制。MySQL中常用的完整性約束條件如下表所示:
表1 MySQL中的完整性約束條件
約束條件 | 說明 |
PRIMARY KEY | 表示該字段為該表的主鍵,可以唯一的標識對應的元組 |
FOREIGN KEY | 標識該屬性為該表的外鍵,與之聯系的是父表的主鍵 |
NOT NULL | 標識該字段不能為空 |
UNIQUE | 標識該字段是唯一的 |
AUTO_INCREMENT | 標識該屬性的值自動增加,MySQL的特色 |
DEFAULT | 可以為字段設置默認值 |
下面分小節說明一下,這幾個完整性約束條件的測試。
1.1 主鍵的測試
設置主鍵的目的是可以幫助MySQL以最快的速度查找表中的某一條信息。
特點:主鍵必須唯一;
任意兩條表中記錄主鍵的字段不能相同;
主鍵必須是非空值;
主鍵可以是單一字段,也可以是多個字段的組合。
單個字段的主鍵測試
語法規則:字段名 數據類型 PRIMARY KEY
實例:創建一張student表,設置stu_id為主鍵,實現代碼如下: CREATE TABLE IF NOT EXISTS student( stu_id INT PRIMARY KEY , stu_name VARCHAR(20), stu_age INT, stu_sex ENUM('男','女','保密') );
多個主鍵的測試
語法規則:PRIMARY KEY(字段1,字段2,...字段n)
實例:創建一張teacher表,設置主鍵為tea_id和course_id,實現代碼如下: CREATE TABLE IF NOT EXISTS teacher( tea_id TINYINT, name VARCHAR(20), course_id INT, PRIMARY KEY(tea_id,course_id) );
1.2 外鍵的測試
語法規則如下:
CONSTRAINT 外鍵別名 FOREIGN KEY(字段1.1 ,字段1.2,字段1.3, ...)
REFERENCES 表名(字段2.1 ,字段2.2,...)
說明:‘外鍵別名’是外鍵的代號;字段1中的參數列表是在子表中設置的外鍵,‘表名’參數是父表的名稱;‘字段2’參數列表是父表的主鍵。
實例:新建一張grade表,設置stu_id為外鍵,與student表中的主鍵stu_id相關聯。
SQL代碼如下:
CREATE TABLE IF NOT EXISTS grade( id INT PRIMARY KEY, stu_id INT, stu_name VARCHAR(20), `數學` FLOAT, `英語` FLOAT, `語文` FLOAT, CONSTRAINT grade_fk FOREIGN KEY (stu_id) REFERENCES student(stu_id) );
注意:創建的子表的外鍵必須是父表的主鍵。并且兩者的數據類型必須是一致的,如果不一致,則不能創建成功。
1.3 非空約束的測試
非空約束就是要求表中設置的字段的值不能為空值,如果用戶插入的字段值為空值時,此時數據庫就會出現報錯信息,不能正確的插入數據,‘NOT NULL’ 約束經常與“DEFAULT”約束條件聯合使用
基本語法規則:
字段 數據類型 NOT NULL
實例:重新創建一張student2表,設置sex字段為非空。
CREATE TABLE IF NOT EXISTS student2( id TINYINT PRIMARY KEY, name VARCHAR(20), sex ENUM('男','女','保密') NOT NULL, age TINYINT );
1.4 測試唯一性約束
唯一性約束就是指所有記錄中的該字段的值不能夠重復出現,例如,每個人的×××號都是不同的,可以將×××字段設置為唯一性,當插入的數據出現兩個相同的×××號時,數據庫就會出現告警信息。簡單的說,唯一性約束條件要求所有記錄該字段的值不能重復出現。
基本語法如下:
字段 數據類型 UNIQUE
實例:創建一張student3表,設置id字段的屬性為唯一性,SQL 代碼如下:
CREATE TABLE IF NOT EXISTS student3( id INT NOT NULL UNIQUE, name VARCHAR(20), age TINYINT );
1.5 測試自增長
AUTO_INCREMENT 是MySQL數據庫中一種特殊的約束條件,為表中插入的新紀錄自動生成一個唯一的ID。且一張表中只能有一個字段使用AUTO_INCREMENT約束,該字段必須為主鍵的一部分,被約束的字段的類型可以為任何整數類型(INT TINYINT SMALLINT MEDIUMINT BIGINT)默認情況下該字段從1開始自增長。
基本語法:字段名 數據類型 AUTO_INCREMENT
實例:新建一張表student4,設置字段id為自增長屬性。
CREATE TABLE IF NOT EXISTS student4( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(30) , age TINYINT );
1.6 測試默認值
在創建表時可以為表中的字段添加默認值,如果插入數據時沒有為這個字段插入數據,則這個字段就會為自動添加一個默認值。通過DEFAULT關鍵字來設置默認值的。
基本語法:字段 數據類型 DEFAULT 默認值
實例:創建一張表student5,位表中字段age和sex設置默認值,SQL代碼如下:
CREATE TABLE IF NOT EXISTS student5( id INT PRIMARY KEY , name VARCHAR(20) NOT NULL, age TINYINT DEFAULT '20', sex ENUM('男','女','保密') DEFAULT '男' );
2、如何查詢表結構?
數據庫定義完成后,可以通過查詢語句來查看已經定義好的數據庫,經常使用的查詢語句為
DESCRIBE和SHOW CREATE TABLE通過這兩個語句可以查看表的字段名、數據類型和完整性約束條件。
2.1 測試DESCRIBE語句
語法結構: DESCRIBE 表名;
實例:查詢一下剛剛建立好的student表結構。
Thu Dec 08 00:58:40 2016localhosttest_db>DESCRIBE student; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | stu_id | int(11) | NO | PRI | NULL | | | stu_name | varchar(20) | YES | | NULL | | | stu_age | int(11) | YES | | NULL | | | stu_sex | enum('男','女','保密') | YES | | NULL | | +----------+------------------------+------+-----+---------+-------+ 4 rows in set (0.02 sec)
DESCRIBE 可以簡寫為DESC,代碼運行如下:
Thu Dec 08 00:59:02 2016localhosttest_db>DESC student; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | stu_id | int(11) | NO | PRI | NULL | | | stu_name | varchar(20) | YES | | NULL | | | stu_age | int(11) | YES | | NULL | | | stu_sex | enum('男','女','保密') | YES | | NULL | | +----------+------------------------+------+-----+---------+-------+ 4 rows in set (0.01 sec)
從查詢結果中,可以看到字段名(Field)、數據類型(Type)、是否為空(null)、是否為主外鍵(key)、默認值(Default)、額外信息(Extra)。
2.2 測試 SHOW CREATE TABLE 語句
通過SHOW CREATE TABLE語句可以查看更加詳細的信息,除了能夠查詢字段名、數據類型、完整性約束條件信息外,還可以查看表的存儲引擎和使用的字符編碼。
基本語法: SHOW CREATE TABLE 表名;
實例:要查看剛剛建好的student1的表結構,SQL語句顯示如下:
Thu Dec 08 01:12:27 2016localhosttest_db>SHOW CREATE TABLE student2 \G *************************** 1. row *************************** Table: student2 Create Table: CREATE TABLE `student2` ( `id` tinyint(4) NOT NULL, `name` varchar(20) DEFAULT NULL, `sex` enum('男','女','保密') NOT NULL, `age` tinyint(4) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
注:后面加\G結尾可以使得顯示的結果更加直觀。
3、如何修改表?
數據庫中的表建立好以后,可以通過SQL語句修改已經建立好的數據表。MySQL通過ALTER TABLE 語句修改表中的元素。例如,可以修改表名、修改字段的數據類型、修改字段名、增加字段、刪除字段、修改字段的排列位置、更改默認的存儲引擎和刪除表的外鍵約束等。
3.1 修改表名
通過表名在一個數據庫下是唯一確定的,不可能存在兩個相同的數據表名。有時候為了實際需要,我們需要更改數據表的名字,重新建立一張一樣的表費時費力,這時我們可以通過SQL語句ALTER TABLE修改表的名字。
基本語法:ALTER TABLE 舊的表名 RENAME [TO |AS] 新表名;
實例:我們要把表student表名改為stu,把student2表名改為stu1,把student3表名改為stu2。SQL代碼如下:
--先查看一下庫中都有那些表 Thu Dec 08 01:11:32 2016localhosttest_db>SHOW TABLES; +-------------------+ | Tables_in_test_db | +-------------------+ | grade | | student | | student2 | | student3 | | student4 | | student5 | | teacher | +-------------------+ 7 rows in set (0.00 sec) -- 執行SQL 代碼 ALTER TABLE student RENAME TO stu; ALTER TABLE student2 RENAME AS stu1; ALTER TABLE student3 RENAME stu2; -- 通過SHOW TABLES語句查看是否更改成功 Thu Dec 08 01:33:59 2016localhosttest_db>SHOW TABLES; +-------------------+ | Tables_in_test_db | +-------------------+ | grade | | stu | | stu1 | | stu2 | | student4 | | student5 | | teacher | +-------------------+ 7 rows in set (0.00 sec)
說明:[TO|AS]為可選參數,可加可不加。
3.2 修改字段的數據類型
用ALTER TABLE 語句可以修改字段的數據類型,基本語法如下:
ALTER TABLE 表名 MODIFY 屬性名 數據類型;
實例:將stu數據表中的name 字段的數據類型修改為VARCHAR(30),SQL代碼如下:
--先查看一下stu_name 現有的數據類型 Thu Dec 08 01:34:09 2016localhosttest_db>DESC stu; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | stu_id | int(11) | NO | PRI | NULL | | | stu_name | varchar(20) | YES | | NULL | | | stu_age | int(11) | YES | | NULL | | | stu_sex | enum('男','女','保密') | YES | | NULL | | +----------+------------------------+------+-----+---------+-------+ 4 rows in set (0.02 sec) -- 執行SQL代碼,將stu_name的數據類型修改為VARCHAR(30) Thu Dec 08 01:44:53 2016localhosttest_db>ALTER TABLE stu MODIFY stu_name VARCHAR(30); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 -- 查詢修改后的stu_name的數據類型 Thu Dec 08 01:45:55 2016localhosttest_db>DESC stu; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | stu_id | int(11) | NO | PRI | NULL | | | stu_name | varchar(30) | YES | | NULL | | | stu_age | int(11) | YES | | NULL | | | stu_sex | enum('男','女','保密') | YES | | NULL | | +----------+------------------------+------+-----+---------+-------+ 4 rows in set (0.02 sec)
3.3 修改表中的字段名
有時候我們需要修改表的字段名,通過ALTER TABLE 語句可以修改表的字段名。
基本語法如下:
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據屬性;
實例1:修改表stu中的字段'stu_name'改為name,不改變他的數據類型。SQL語句實現如下:
-- 先查看一下stu的表結構 Thu Dec 08 20:54:26 2016localhosttest_db>DESC stu; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | stu_id | int(11) | NO | PRI | NULL | | | stu_name | varchar(30) | YES | | NULL | | | stu_age | int(11) | YES | | NULL | | | stu_sex | enum('男','女','保密') | YES | | NULL | | +----------+------------------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) -- 執行ALTER TABLE 語句修改字段的名字 Thu Dec 08 20:54:40 2016localhosttest_db>ALTER TABLE stu CHANGE stu_name name VARCHAR(30); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 20:56:56 2016localhosttest_db>DESC stu; +---------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------------+------+-----+---------+-------+ | stu_id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | stu_age | int(11) | YES | | NULL | | | stu_sex | enum('男','女','保密') | YES | | NULL | | +---------+------------------------+------+-----+---------+-------+ 4 rows in set (0.02 sec)
實例2:修改字段名同時修改字段的數據類型,將stu表中的字段'stu_id'修改為'id',數據類型變為TINYINT,約束條件仍為主鍵。將'stu_age'改為‘age’,數據類型為TINYINT,完整性約束條件設為‘非空’,
字段‘stu_sex’改為sex 數據類型不變,完整性約束條件改為‘DEFAULT '保密'’。執行代碼如下:
Thu Dec 08 21:32:00 2016localhosttest_db>DESC stu; +---------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------------+------+-----+---------+-------+ | stu_id | int(11) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | stu_age | int(11) | YES | | NULL | | | stu_sex | enum('男','女','保密') | YES | | NULL | | +---------+------------------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) Thu Dec 08 21:32:12 2016localhosttest_db>ALTER TABLE stu CHANGE stu_id id TINYINT primary key; ERROR 1068 (42000): Multiple primary key defined -- 需要注意的是,修改主鍵名時,后面不需要添加 PRIMARY KEY 關鍵字,否則會出現以上報錯信息。 Thu Dec 08 21:33:03 2016localhosttest_db>ALTER TABLE stu CHANGE stu_id id TINYINT ; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 21:34:35 2016localhosttest_db>ALTER TABLE stu CHANGE stu_age age TINYINT; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 21:35:31 2016localhosttest_db>ALTER TABLE stu CHANGE stu_sex sex ENUM ('男','女','保密') DEFAULT '保密'; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 21:37:29 2016localhosttest_db>DESC stu; +-------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------------+------+-----+---------+-------+ | id | tinyint(4) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | +-------+------------------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) -- 最后,查詢一下表結構,可以看到表中的字段已經修改為我們需要的字段類型了。
3.4 為已經建好的表增加字段
對于已經建好的數據表來說,如果我們想對表進行修改,為表中再添加一個新的字段,使用ALTER TABLE 語句可以為表中增加一個新的字段。它的基本語法如下:
ALTER TABLE 表名 ADD 新的字段名 數據類型 [完整性約束條件] [FIRST|AFTER 已有的字段名];
實例1:為stu表增加一個新的字段 Tel 不需要添加任何的完整性約束條件。SQL代碼如下:
-- 先查看一下表結構 Thu Dec 08 21:37:29 2016localhosttest_db>DESC stu; +-------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------------+------+-----+---------+-------+ | id | tinyint(4) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | +-------+------------------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) -- 為表增加一個新的字段tel Thu Dec 08 21:37:39 2016localhosttest_db>ALTER TABLE stu ADD tel CHAR(11); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 -- 查詢一下表結構,可以看到表stu增加的一個新的字段tel Thu Dec 08 21:55:42 2016localhosttest_db>DESC stu; +-------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------------+------+-----+---------+-------+ | id | tinyint(4) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | | tel | char(11) | YES | | NULL | | +-------+------------------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
實例2:為stu表添加一個字段address ,設置完整性約束條件為‘非空’。SQL代碼如下:
Thu Dec 08 21:55:49 2016localhosttest_db>ALTER TABLE stu ADD address VARCHAR(20) NOT NULL; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 22:00:47 2016localhosttest_db>DESC stu; +---------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------------+------+-----+---------+-------+ | id | tinyint(4) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | | tel | char(11) | YES | | NULL | | | address | varchar(20) | NO | | NULL | | +---------+------------------------+------+-----+---------+-------+ 6 rows in set (0.02 sec)
測試3:在表的第一個位置增加字段,在stu表中增加num字段,其SQL代碼如下:
Thu Dec 08 22:00:53 2016localhosttest_db>ALTER TABLE stu ADD num TINYINT FIRST; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 22:28:24 2016localhosttest_db>DESC stu; +---------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------------+------+-----+---------+-------+ | num | tinyint(4) | YES | | NULL | | | id | tinyint(4) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | | tel | char(11) | YES | | NULL | | | address | varchar(20) | NO | | NULL | | +---------+------------------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)
測試4:在指定位置之后添加一個字段。
-- 在stu表的tel 字段后面添加一個新的字段‘birthday’ Thu Dec 08 22:28:38 2016localhosttest_db>ALTER TABLE stu ADD birthday DATE AFTER tel; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 22:34:52 2016localhosttest_db>DESC stu; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | num | tinyint(4) | YES | | NULL | | | id | tinyint(4) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | | tel | char(11) | YES | | NULL | | | birthday | date | YES | | NULL | | | address | varchar(20) | NO | | NULL | | +----------+------------------------+------+-----+---------+-------+ 8 rows in set (0.01 sec)
3.5 刪除字段
刪除字段是指我們可以刪除表中已經定義好的字段。使用ALTER TABLE 可以實現將表中的某個定義好的字段進行刪除操作。其基本語法如下:
ALTER TABLE 表名 DROP 字段名;
例如,表stu中的字段num我們不在需要,現在需要對它進行刪除操作,SQL代碼如下:
Thu Dec 08 22:42:31 2016localhosttest_db>ALTER TABLE stu DROP num; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 22:42:53 2016localhosttest_db>DESC stu; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | id | tinyint(4) | NO | PRI | 0 | | | name | varchar(30) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | | tel | char(11) | YES | | NULL | | | birthday | date | YES | | NULL | | | address | varchar(20) | NO | | NULL | | +----------+------------------------+------+-----+---------+-------+ 7 rows in set (0.01 sec)
3.6 修改字段的排列位置
使用ALTER TABLE 語句也可以修改表中字段的排列位置,基本語法如下:
ALTER TABLE 表名 MODIFY 字段名1 數據類型 FIRST|AFTER 字段名2;
說明:字段名1 是需要改變位置的字段名稱;“數據類型”是字段1的數據類型;FIRST 參數是將字段1改變到第一個位置;“AFTER 字段名2”參數是將字段1加入到字段2的后面。
--測試將stu表中的name字段插入到第一個位置,將字段‘sex’修改到字段‘tel’的后面 ALTER TABLE stu MODIFY name VARCHAR(30) FIRST; ALTER TABLE stu MODIFY sex ENUM('男','女','保密') AFTER tel; Thu Dec 08 22:43:08 2016localhosttest_db>ALTER TABLE stu MODIFY name VARCHAR(30) FIRST; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 22:56:00 2016localhosttest_db>DESC stu; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | name | varchar(30) | YES | | NULL | | | id | tinyint(4) | NO | PRI | 0 | | | age | tinyint(4) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | 保密 | | | tel | char(11) | YES | | NULL | | | birthday | date | YES | | NULL | | | address | varchar(20) | NO | | NULL | | +----------+------------------------+------+-----+---------+-------+ 7 rows in set (0.00 sec) Thu Dec 08 22:56:12 2016localhosttest_db>ALTER TABLE stu MODIFY sex ENUM('男','女','保密') AFTER tel; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 22:56:26 2016localhosttest_db>DESC stu; +----------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------+------+-----+---------+-------+ | name | varchar(30) | YES | | NULL | | | id | tinyint(4) | NO | PRI | 0 | | | age | tinyint(4) | YES | | NULL | | | tel | char(11) | YES | | NULL | | | sex | enum('男','女','保密') | YES | | NULL | | | birthday | date | YES | | NULL | | | address | varchar(20) | NO | | NULL | | +----------+------------------------+------+-----+---------+-------+ 7 rows in set (0.02 sec)
3.7 更改表的存儲引擎
MySQL中常用的存儲引擎有三個:InnoDB、MyISAM、MEMORY等。通過ALTER TABLE 語句可以更改表的存儲引擎類型。其語法結構如下:
ALTER TABLE 表名 ENGINE=存儲引擎名;
例如,將stu表的存儲引擎改為 MyISAM,SQL 代碼如下:
Thu Dec 08 22:56:34 2016localhosttest_db>ALTER TABLE stu ENGINE=MyISAM; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 23:03:35 2016localhosttest_db>SHOW CREATE TABLE stu \G *************************** 1. row *************************** Table: stu Create Table: CREATE TABLE `stu` ( `name` varchar(30) DEFAULT NULL, `id` tinyint(4) NOT NULL DEFAULT '0', `age` tinyint(4) DEFAULT NULL, `tel` char(11) DEFAULT NULL, `sex` enum('男','女','保密') DEFAULT NULL, `birthday` date DEFAULT NULL, `address` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.05 sec)
注意:如果表中已經有很多數據,不建議更改表的存儲引擎,如果更改了存儲引擎可能會發生一些意料之外的影響。
3.8 刪除表的外鍵的約束
外鍵是一個特殊的字段,它將某一表與父表建立關聯關系。 在創建表的時候外鍵約束就已經設定好了,如果想要去除與父表之間的關聯,可以用ALTER TABLE 語句刪除外鍵的約束。基本語法如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵別名;
-- 創建表grade 設置stu_num為表student主鍵的外鍵 Thu Dec 08 23:36:16 2016localhosttest_db>CREATE TABLE IF NOT EXISTS grade( -> id INT PRIMARY KEY, -> stu_num INT , -> english FLOAT, -> math FLOAT, -> CONSTRAINT g_fk FOREIGN KEY (stu_num) -> REFERENCES student(id) -> ); Query OK, 0 rows affected (0.00 sec) -- 查看一下grade的表結構 Thu Dec 08 23:40:53 2016localhosttest_db>SHOW CREATE TABLE grade; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | grade | CREATE TABLE `grade` ( `id` int(11) NOT NULL, `stu_num` int(11) DEFAULT NULL, `english` float DEFAULT NULL, `math` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `g_fk` (`stu_num`), CONSTRAINT `g_fk` FOREIGN KEY (`stu_num`) REFERENCES `student` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) -- 刪除外鍵約束 Thu Dec 08 23:41:18 2016localhosttest_db>ALTER TABLE grade DROP FOREIGN KEY g_fk; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 23:42:45 2016localhosttest_db>SHOW CREATE TABLE grade; +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | grade | CREATE TABLE `grade` ( `id` int(11) NOT NULL, `stu_num` int(11) DEFAULT NULL, `english` float DEFAULT NULL, `math` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `g_fk` (`stu_num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
4.刪除表
刪除表時指刪除已經存在的數據表。刪除表同時也會刪除表中的所有數據,因此,刪除前應做好必要的準備。MySQL中使用 DROP TABLE 語句來刪除表。對于一些表來說,創建表的時候存在著外鍵的約束,一些表成為了與之相聯系的表的父表。要刪除這些父表,情況就比較復雜了。
4.1 刪除沒有被關聯的普通表
直接使用DROP TABLE語句刪除沒有被關聯的普通表,使用語法如下:
DROP TABLE 表名;
例如,要刪除student5表,SQL 語句如下:
-- 先查看一下student5的表結構 Thu Dec 08 23:22:02 2016localhosttest_db>DESC student5; +-------+------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | age | tinyint(4) | YES | | 20 | | | sex | enum('男','女','保密') | YES | | 男 | | +-------+------------------------+------+-----+---------+-------+ 4 rows in set (0.01 sec) -- 執行刪除代碼 Thu Dec 08 23:23:46 2016localhosttest_db>DROP TABLE student5; Query OK, 0 rows affected (0.00 sec) Thu Dec 08 23:24:05 2016localhosttest_db>DESC student5; ERROR 1146 (42S02): Table 'test_db.student5' doesn't exist
4.2 刪除有外鍵關聯的表
要想刪除一個帶有外鍵關聯的表,首先,需要刪除表的外鍵,然后才能刪除表結構,SQL語句如下:
-- 先創建一個grade表,字段stu_num為表student主鍵的外鍵 Thu Dec 08 23:48:16 2016localhosttest_db>CREATE TABLE IF NOT EXISTS grade( -> id INT PRIMARY KEY, -> stu_num INT , -> english FLOAT, -> math FLOAT, -> CONSTRAINT g_fk FOREIGN KEY (stu_num) -> REFERENCES student(id) -> ); Query OK, 0 rows affected (0.02 sec) -- 查看一下grade的表結構 Thu Dec 08 23:48:51 2016localhosttest_db>SHOW CREATE TABLE grade \G *************************** 1. row *************************** Table: grade Create Table: CREATE TABLE `grade` ( `id` int(11) NOT NULL, `stu_num` int(11) DEFAULT NULL, `english` float DEFAULT NULL, `math` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `g_fk` (`stu_num`), CONSTRAINT `g_fk` FOREIGN KEY (`stu_num`) REFERENCES `student` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) -- 執行一下刪除命令,刪除表student,發現不能執行刪除命令 Thu Dec 08 23:49:19 2016localhosttest_db>DROP TABLE student; ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails -- 執行命令,刪除一下表grade的外鍵約束 Thu Dec 08 23:49:39 2016localhosttest_db>ALTER TABLE grade DROP FOREIGN KEY g_fk; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 Thu Dec 08 23:50:46 2016localhosttest_db>SHOW CREATE TABLE grade \G *************************** 1. row *************************** Table: grade Create Table: CREATE TABLE `grade` ( `id` int(11) NOT NULL, `stu_num` int(11) DEFAULT NULL, `english` float DEFAULT NULL, `math` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `g_fk` (`stu_num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) -- 再次執行一下刪除命令,發現成功刪除了student表 Thu Dec 08 23:50:54 2016localhosttest_db>DROP TABLE student; Query OK, 0 rows affected (0.02 sec) Thu Dec 08 23:51:13 2016localhosttest_db>SHOW TABLES; +-------------------+ | Tables_in_test_db | +-------------------+ | animalinfo | | grade | | stu | | teacher | +-------------------+ 4 rows in set (0.00 sec)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。