溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL學(xué)習(xí)之創(chuàng)建、修改、刪除表

發(fā)布時間:2020-06-09 21:31:22 來源:網(wǎng)絡(luò) 閱讀:2021 作者:hectorHe 欄目:數(shù)據(jù)庫

1、如何創(chuàng)建表結(jié)構(gòu)?


  語法格式如下:    

   CREATE TABLE [IF NOT EXISTS] 表名 (
          字段1 數(shù)據(jù)類型 [完整性約束條件],
          字段2 數(shù)據(jù)類型 [完整性約束條件],
          ....
          字段n 數(shù)據(jù)類型 [完整性約束條件]
         );

  說明 :[IF NOT EXISTS] 為可選字段,加上此選項后如果創(chuàng)建的數(shù)據(jù)表已經(jīng)存在,不會報錯,只會出現(xiàn)警告信息,而不會報錯,如果不加此選項會出現(xiàn)報錯信息。創(chuàng)建的表的名字不能為SQL語言的關(guān)鍵字如create、updata和order等,每個字段的結(jié)束后用逗號隔開,最后一個字段不需要加逗號。

  完整性約束條件也是可選字段,是對字段進(jìn)行限制。MySQL中常用的完整性約束條件如下表所示:

表1 MySQL中的完整性約束條件

約束條件         說明
PRIMARY KEY表示該字段為該表的主鍵,可以唯一的標(biāo)識對應(yīng)的元組
FOREIGN KEY
標(biāo)識該屬性為該表的外鍵,與之聯(lián)系的是父表的主鍵
NOT NULL 標(biāo)識該字段不能為空
UNIQUE標(biāo)識該字段是唯一的
AUTO_INCREMENT標(biāo)識該屬性的值自動增加,MySQL的特色
DEFAULT可以為字段設(shè)置默認(rèn)值

下面分小節(jié)說明一下,這幾個完整性約束條件的測試。


1.1 主鍵的測試 


   設(shè)置主鍵的目的是可以幫助MySQL以最快的速度查找表中的某一條信息。

   特點:主鍵必須唯一;

       任意兩條表中記錄主鍵的字段不能相同;

       主鍵必須是非空值;

       主鍵可以是單一字段,也可以是多個字段的組合。

   單個字段的主鍵測試

   語法規(guī)則:字段名 數(shù)據(jù)類型 PRIMARY KEY  

    實例:創(chuàng)建一張student表,設(shè)置stu_id為主鍵,實現(xiàn)代碼如下:
    
      CREATE TABLE IF NOT EXISTS student(
        stu_id INT PRIMARY KEY ,
        stu_name VARCHAR(20),
        stu_age INT,
        stu_sex ENUM('男','女','保密')
    );

   多個主鍵的測試

   語法規(guī)則:PRIMARY KEY(字段1,字段2,...字段n)

    實例:創(chuàng)建一張teacher表,設(shè)置主鍵為tea_id和course_id,實現(xiàn)代碼如下:
    
    CREATE TABLE IF NOT EXISTS teacher(
        tea_id TINYINT,
        name VARCHAR(20),
        course_id INT,
        PRIMARY KEY(tea_id,course_id)
        );

1.2 外鍵的測試


  語法規(guī)則如下:

   CONSTRAINT 外鍵別名 FOREIGN KEY(字段1.1 ,字段1.2,字段1.3, ...)

        REFERENCES 表名(字段2.1 ,字段2.2,...)

   說明:‘外鍵別名’是外鍵的代號;字段1中的參數(shù)列表是在子表中設(shè)置的外鍵,‘表名’參數(shù)是父表的名稱;‘字段2’參數(shù)列表是父表的主鍵。

   實例:新建一張grade表,設(shè)置stu_id為外鍵,與student表中的主鍵stu_id相關(guān)聯(lián)。

SQL代碼如下:

CREATE TABLE IF NOT EXISTS grade(
        id INT PRIMARY KEY,
        stu_id INT,
        stu_name VARCHAR(20),
        `數(shù)學(xué)` FLOAT,
        `英語` FLOAT,
        `語文` FLOAT,
        CONSTRAINT grade_fk FOREIGN KEY (stu_id)
            REFERENCES student(stu_id)        
);

注意:創(chuàng)建的子表的外鍵必須是父表的主鍵。并且兩者的數(shù)據(jù)類型必須是一致的,如果不一致,則不能創(chuàng)建成功。


1.3 非空約束的測試


  非空約束就是要求表中設(shè)置的字段的值不能為空值,如果用戶插入的字段值為空值時,此時數(shù)據(jù)庫就會出現(xiàn)報錯信息,不能正確的插入數(shù)據(jù),‘NOT NULL’ 約束經(jīng)常與“DEFAULT”約束條件聯(lián)合使用

  基本語法規(guī)則:

    字段 數(shù)據(jù)類型 NOT NULL

  實例:重新創(chuàng)建一張student2表,設(shè)置sex字段為非空。

 CREATE TABLE IF NOT EXISTS student2(
    id TINYINT PRIMARY KEY,
    name VARCHAR(20),
    sex ENUM('男','女','保密') NOT NULL,
    age TINYINT
);

1.4 測試唯一性約束   


  唯一性約束就是指所有記錄中的該字段的值不能夠重復(fù)出現(xiàn),例如,每個人的×××號都是不同的,可以將×××字段設(shè)置為唯一性,當(dāng)插入的數(shù)據(jù)出現(xiàn)兩個相同的×××號時,數(shù)據(jù)庫就會出現(xiàn)告警信息。簡單的說,唯一性約束條件要求所有記錄該字段的值不能重復(fù)出現(xiàn)。

  基本語法如下:

     字段 數(shù)據(jù)類型 UNIQUE

  實例:創(chuàng)建一張student3表,設(shè)置id字段的屬性為唯一性,SQL 代碼如下:

CREATE TABLE IF NOT EXISTS student3(
        id INT NOT NULL UNIQUE,
        name VARCHAR(20),
        age TINYINT
);

1.5 測試自增長


   AUTO_INCREMENT 是MySQL數(shù)據(jù)庫中一種特殊的約束條件,為表中插入的新紀(jì)錄自動生成一個唯一的ID。且一張表中只能有一個字段使用AUTO_INCREMENT約束,該字段必須為主鍵的一部分,被約束的字段的類型可以為任何整數(shù)類型(INT TINYINT SMALLINT MEDIUMINT BIGINT)默認(rèn)情況下該字段從1開始自增長。

  基本語法:字段名 數(shù)據(jù)類型 AUTO_INCREMENT

  實例:新建一張表student4,設(shè)置字段id為自增長屬性。

CREATE TABLE IF NOT EXISTS student4(
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(30) ,
        age TINYINT
);

1.6 測試默認(rèn)值


  在創(chuàng)建表時可以為表中的字段添加默認(rèn)值,如果插入數(shù)據(jù)時沒有為這個字段插入數(shù)據(jù),則這個字段就會為自動添加一個默認(rèn)值。通過DEFAULT關(guān)鍵字來設(shè)置默認(rèn)值的。

   基本語法:字段 數(shù)據(jù)類型 DEFAULT 默認(rèn)值

   實例:創(chuàng)建一張表student5,位表中字段age和sex設(shè)置默認(rèn)值,SQL代碼如下:

CREATE TABLE IF NOT EXISTS student5(
        id INT PRIMARY KEY ,
        name VARCHAR(20) NOT NULL,
        age TINYINT DEFAULT '20',
        sex ENUM('男','女','保密') DEFAULT '男'
  );

2、如何查詢表結(jié)構(gòu)?


  數(shù)據(jù)庫定義完成后,可以通過查詢語句來查看已經(jīng)定義好的數(shù)據(jù)庫,經(jīng)常使用的查詢語句為

DESCRIBE和SHOW CREATE TABLE通過這兩個語句可以查看表的字段名、數(shù)據(jù)類型和完整性約束條件。


2.1 測試DESCRIBE語句


   語法結(jié)構(gòu): DESCRIBE 表名;

   實例:查詢一下剛剛建立好的student表結(jié)構(gòu)。

 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)

從查詢結(jié)果中,可以看到字段名(Field)、數(shù)據(jù)類型(Type)、是否為空(null)、是否為主外鍵(key)、默認(rèn)值(Default)、額外信息(Extra)。


2.2 測試 SHOW CREATE TABLE 語句


   通過SHOW CREATE TABLE語句可以查看更加詳細(xì)的信息,除了能夠查詢字段名、數(shù)據(jù)類型、完整性約束條件信息外,還可以查看表的存儲引擎和使用的字符編碼。

   基本語法: SHOW CREATE TABLE 表名;

   實例:要查看剛剛建好的student1的表結(jié)構(gòu),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結(jié)尾可以使得顯示的結(jié)果更加直觀。


3、如何修改表?


  數(shù)據(jù)庫中的表建立好以后,可以通過SQL語句修改已經(jīng)建立好的數(shù)據(jù)表。MySQL通過ALTER TABLE 語句修改表中的元素。例如,可以修改表名、修改字段的數(shù)據(jù)類型、修改字段名、增加字段、刪除字段、修改字段的排列位置、更改默認(rèn)的存儲引擎和刪除表的外鍵約束等。


3.1 修改表名


   通過表名在一個數(shù)據(jù)庫下是唯一確定的,不可能存在兩個相同的數(shù)據(jù)表名。有時候為了實際需要,我們需要更改數(shù)據(jù)表的名字,重新建立一張一樣的表費時費力,這時我們可以通過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)
-- 執(zhí)行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]為可選參數(shù),可加可不加。


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


  用ALTER TABLE 語句可以修改字段的數(shù)據(jù)類型,基本語法如下:

  ALTER TABLE 表名 MODIFY 屬性名 數(shù)據(jù)類型;

  實例:將stu數(shù)據(jù)表中的name 字段的數(shù)據(jù)類型修改為VARCHAR(30),SQL代碼如下:

--先查看一下stu_name 現(xiàn)有的數(shù)據(jù)類型
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)

-- 執(zhí)行SQL代碼,將stu_name的數(shù)據(jù)類型修改為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的數(shù)據(jù)類型

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 舊字段名 新字段名 新數(shù)據(jù)屬性;

   實例1:修改表stu中的字段'stu_name'改為name,不改變他的數(shù)據(jù)類型。SQL語句實現(xiàn)如下:

-- 先查看一下stu的表結(jié)構(gòu)

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)


-- 執(zhí)行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:修改字段名同時修改字段的數(shù)據(jù)類型,將stu表中的字段'stu_id'修改為'id',數(shù)據(jù)類型變?yōu)門INYINT,約束條件仍為主鍵。將'stu_age'改為‘a(chǎn)ge’,數(shù)據(jù)類型為TINYINT,完整性約束條件設(shè)為‘非空’,

字段‘stu_sex’改為sex 數(shù)據(jù)類型不變,完整性約束條件改為‘DEFAULT '保密'’。執(zhí)行代碼如下:

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 關(guān)鍵字,否則會出現(xiàn)以上報錯信息。

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)
-- 最后,查詢一下表結(jié)構(gòu),可以看到表中的字段已經(jīng)修改為我們需要的字段類型了。


3.4 為已經(jīng)建好的表增加字段


  對于已經(jīng)建好的數(shù)據(jù)表來說,如果我們想對表進(jìn)行修改,為表中再添加一個新的字段,使用ALTER TABLE 語句可以為表中增加一個新的字段。它的基本語法如下:

  ALTER TABLE 表名 ADD 新的字段名 數(shù)據(jù)類型 [完整性約束條件] [FIRST|AFTER 已有的字段名];

 實例1:為stu表增加一個新的字段 Tel 不需要添加任何的完整性約束條件。SQL代碼如下:

-- 先查看一下表結(jié)構(gòu)

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

-- 查詢一下表結(jié)構(gòu),可以看到表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 ,設(shè)置完整性約束條件為‘非空’。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 刪除字段


   刪除字段是指我們可以刪除表中已經(jīng)定義好的字段。使用ALTER TABLE 可以實現(xiàn)將表中的某個定義好的字段進(jìn)行刪除操作。其基本語法如下:

   ALTER TABLE 表名 DROP 字段名;

   例如,表stu中的字段num我們不在需要,現(xiàn)在需要對它進(jìn)行刪除操作,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 數(shù)據(jù)類型 FIRST|AFTER 字段名2;

 說明:字段名1 是需要改變位置的字段名稱;“數(shù)據(jù)類型”是字段1的數(shù)據(jù)類型;FIRST 參數(shù)是將字段1改變到第一個位置;“AFTER 字段名2”參數(shù)是將字段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 語句可以更改表的存儲引擎類型。其語法結(jié)構(gòu)如下:

  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)

 注意:如果表中已經(jīng)有很多數(shù)據(jù),不建議更改表的存儲引擎,如果更改了存儲引擎可能會發(fā)生一些意料之外的影響。


3.8 刪除表的外鍵的約束


   外鍵是一個特殊的字段,它將某一表與父表建立關(guān)聯(lián)關(guān)系。 在創(chuàng)建表的時候外鍵約束就已經(jīng)設(shè)定好了,如果想要去除與父表之間的關(guān)聯(lián),可以用ALTER TABLE 語句刪除外鍵的約束?;菊Z法如下:

   ALTER TABLE 表名 DROP FOREIGN KEY 外鍵別名;

-- 創(chuàng)建表grade 設(shè)置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的表結(jié)構(gòu)

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.刪除表


  刪除表時指刪除已經(jīng)存在的數(shù)據(jù)表。刪除表同時也會刪除表中的所有數(shù)據(jù),因此,刪除前應(yīng)做好必要的準(zhǔn)備。MySQL中使用 DROP TABLE 語句來刪除表。對于一些表來說,創(chuàng)建表的時候存在著外鍵的約束,一些表成為了與之相聯(lián)系的表的父表。要刪除這些父表,情況就比較復(fù)雜了。


4.1 刪除沒有被關(guān)聯(lián)的普通表

   直接使用DROP TABLE語句刪除沒有被關(guān)聯(lián)的普通表,使用語法如下:

   DROP TABLE 表名;

   例如,要刪除student5表,SQL 語句如下:

-- 先查看一下student5的表結(jié)構(gòu)
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)

-- 執(zhí)行刪除代碼

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 刪除有外鍵關(guān)聯(lián)的表

  

  要想刪除一個帶有外鍵關(guān)聯(lián)的表,首先,需要刪除表的外鍵,然后才能刪除表結(jié)構(gòu),SQL語句如下:


-- 先創(chuàng)建一個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的表結(jié)構(gòu)

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)

-- 執(zhí)行一下刪除命令,刪除表student,發(fā)現(xiàn)不能執(zhí)行刪除命令

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

-- 執(zhí)行命令,刪除一下表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)

-- 再次執(zhí)行一下刪除命令,發(fā)現(xiàn)成功刪除了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)


  


   










向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI