二級MySQL數據庫程序設計(三)

課程目錄
第1章 數據庫的基本概念與設計方法
第2章 MySQL簡介
第3章 數據庫和表
第4章 表數據的基本操作
第5章 數據庫的查詢
第6章 索引
第7章 視圖
第8章 數據完整性約束與表維護語句
第9章 觸發器
第10章 事件
第11章 存儲過程與存儲函數
第12章 訪問控制與安全管理
第13章 備份與恢復
第14章 PHP和MySQL數據庫編程
第15章 開發實例

本章學習流程圖

在這裏插入圖片描述

本章學習大綱

在這裏插入圖片描述

3. 數據庫和表

3.1 創建與使用數據庫

在這裏插入圖片描述

3.1.1 創建數據庫

注意:在對MySQL數據庫進行任何操作之前,都需要連接數據庫。
在MySQL中,可以使用CREATE DATABASE語句創建數據庫,其語法格式如下:

create database[IF NOT EXISTS]<數據庫名>;

語法說明:

  • <數據庫名>:創建數據庫的名稱。
  • IF NOT EXISTS:在創建數據庫之前進行判斷,只有該數據庫目前尚不存在時才執行操作。可以用來避免數據庫已經存在而重複創建的錯誤。
  • 在一般語法格式描述中使用如下符號:
    < >:表示在語句中必須指定數據對象,是不可缺少的。
    [ ]:表示可以根據需要進行選擇,也可以不選。
    |:表示多個選項只能選其一。
    { }:表示必選項。

3.1.2 選擇數據庫

語法格式:

USE <數據庫名>;

語法說明:
USE<數據庫名>可以通知MySQL把<數據庫名>所示的數據庫作爲當前數據庫。該數據庫保持爲默認數據庫,知道語段的結尾,或者直到發佈一個不同的USE語句。

3.1.3 修改數據庫

語法格式:

ALTER DATABASE [數據庫名] {[DEFAULT] CHARACTER SET <字符集名> | [DEFAULT] COLLATE <校對規則名>}

語法說明:

  • ALTER DATABASE用於更改數據庫的全局特性。這些特性儲存在數據庫目錄中的db.opt文件中。
  • 使用 ALTER DATABASE,需要獲得數據庫 ALTER 權限。
  • 數據庫名稱可以忽略,此時,語句對應於默認數據庫。
  • CHARACTER SET子句用於更改默認的數據庫字符集。

3.1.4 刪除數據庫

當需要刪除已創建的數據庫時,可以使用DROP DATABASEDROP SCHEMA語句。
語法格式:

DROP DATABASE [IF EXISTS] <數據庫名>

語法說明:

  • <數據庫名>:指定要刪除的數據庫名。
  • IF EXISTS:用於防止當數據庫不存在時發生錯誤。
  • DROP DATABASE:刪除數據庫中的所有表格和同時刪除數據庫。使用此語句時要非常小心,一面錯誤刪除。如果要使用DROP DATABASE,需要獲得數據庫DROP權限。

3.1.5 查看數據庫

語法格式:

SHOW DATABASES [LIKE<數據庫名>]

語法說明:

  • LIKE:可選項LIKE從句用於匹配指定的數據庫名稱。
  • SHOW DATABASES:查看當前用戶權限範圍內的數據庫。

3.2 創建和操縱表

在這裏插入圖片描述
表是數據庫中存放的最基本的數據對象。如果沒有表,數據庫也就沒有意義。

3.2.1 創建表

語法格式:

CREATE TABLE<表名>([表定義選項])[表選項][分區選項];
[表定義選項]
<列名1><類型1>[,......]<列名n><類型n>

CREATE TABLE命令語法比較多,主要是由表創建定義(create-definition)、表選項(table-options)和分區選項(partition-options)組成。

【例】在一個已有的數據庫mytest中新建一個包含姓名、性別、年齡、專業、聯繫方式等字段的學生基本信息表,要求將字段student_id號指定爲該表的主鍵,並使用InnoDB引擎存儲表數據。

mysql> create table students(student_id int not null auto_increment,
    -> student_name char(50) not null,
    -> student_sex char(1) not null default 0,
    -> student_major char(50) not null,
    -> student_contact char(50) null,
    -> primary key(student_id)
    -> )engine = InnoDB;
Query OK, 0 rows affected (1.05 sec)

查看下結果:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 0       |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

表創建基礎

  • CREATE TABLE:用於創建給定名稱的表。必須擁有表CREATE權限。
  • <表名>:指定要創建表的名稱,在CREATE TABLE之後給出,必須符合標識符命名規則。
  • <表定義選項>:表創建定義,由列名(col_name)、列的定義(col_definition),以及可能的空值聲明、完整約束或表索引組成。
  • 默認的情況是,表被創建到當前的數據庫中。如果表已存在,或者沒有當前數據庫,或者數據庫不存在,則會出現錯誤。

數據類型
數據類型:是指系統中所允許的數據的類型。
MySQL的數據類型分別有:數值類型、日期和時間類型、字符串類型、空間數據類型等。

(1)數值類型

  • BIT [ (M) ]:位字段類型。M表示每個值的位數,範圍從1到64。如果M被省略,默認爲1。
  • TINYINT [ (M) ] [UNSIGNED] [ZEROFILL]:很小的整數。帶符號的範圍是-128到127。無符號的範圍是0到255。
  • BOOL,BOOLEAN:是TINYINT(1)的同義詞。zero值被視爲假。非zero值被視爲真。
  • SMALLINT [ (M) ] [UNSIGNED] [ZEROFILL]:小的整數。帶符號的範圍是 -32 768到 32 767。無符號的範圍是0到 65 535。
  • MEDIUMINT [ (M) ] [UNSIGNED] [ZEROFILL]:中等大小的整數。帶符號的範圍是 -8 388 608 到 8 388 607 。無符號的範圍是 0到 16 777 215 。
  • INT [ (M) ] [UNSIGNED] [ZEROFILL]:普通大小的整數。帶符號的範圍是 -2 147 483 648 到 2 147 483 647 。無符號的範圍是0到 4 294 967 295 。
  • INTEGER [ (M) ] [UNSIGNED] [ZEROFILL]:這個是INT的同義詞。
  • BINGINT [ (M) ] [UNSIGNED] [ZEROFILL]:大整數。帶符號的範圍是 - 9 233 372 036 854 775 808 到 9 233 372 036 854 775 807。無符號的範圍是0到 18 446 744 073 709 551 615 。
  • FLOAT [ (M,D) ] [UNSIGNED] [ZEROFILL]:小(單精度)浮點數。允許的值是 -3.402823466E+38 到 -1.175494351E-38、0和 1.175494351E-38 到 3.402823466E+38 。M是小數總位數,D是小數點後面的位數。如果M和D被省略,根據硬件允許的限制來保存值。如果指定UNSIGNED,不允許負值。
  • DOUBLE [ (M,D) ] [UNSIGNED] [ZEROFILL]:普通大小(雙精度)浮點數。允許的值是 -1.7976931348623157E+308 到 -2.2250738585072014E-308、0和 2.225073858072014E-308 到 1.7976931348623157E+308 。M是小數總位數,D是小數點後面的位數。如果M和D被省略,根據硬件允許的限制來保存值。如果指定UNSIGNED,不允許負值。
  • DECIMAL [ (M [,D]) ] [UNSIGNED] [ZEROFILL]:壓縮的“嚴格”定點數。M是小數位數(精度)的總數,D是小數點(標度)後面的位數。小數點和(負數)的“-”符號不包括在M中。如果D是0,則值沒有小數點或分數部分。DECIMAL整數最大位數(M)爲65.支持的十進制數的最大位數(D)是30。如果D被省略,默認是0。如果M被省略,默認是10。如果指定UNSIGNED,不允許負值。
  • DEC:DECIMAL同義詞。

(2)日期和時間類型

  • DATE:日期型。支持的範圍爲 ‘1000-01-01’ 到 ‘9999-12-31’ 。MySQL以’YYYY-MM-DD’格式顯示DATE值,但允許使用字符串或數字爲DATE列分配值。
  • DATETIME:日期和時間的組合。支持的範圍是 ‘1000-01-01 00:00:00’ 到 ‘9999-12-12 23:59:59’ 。MySQL以’YYYY-MM-DD HH:MM:SS’格式顯示DATETIME值,但允許使用字符串或數字爲DATETIME列分配值。
  • TIMESTAMP[ (M) ]:時間戳。範圍是’1970-01-01 00:00:00’到2037年。TIMESTAMP列用於INSERTUPDATE操作時記錄日期和時間。如果你不分配一個值,表中的第一個TIMESTAMP列自動設置爲最近操作的日期和時間。也可以通過分配一個NULL值,將TIMESTAMP列設置爲當前的日期和時間。TIMESTAMP值返回後顯示爲’YYYY-MM-DD’ HH:MM:SS’格式的字符串,顯示寬度固定19個字符。如果想要獲得數字值,應在TIMESTAMP列添加+0 。
  • TIME:時間型。範圍是’-838:59:59’ 到 ‘838:59:59’。MySQL以 ‘HH:MM:SS’ 格式顯示TIME值,但允許使用字符串或數字爲TIME列分配值。
  • YEAR [ (2|4) ]:兩位或四位格式的年。默認是四位格式。在四位格式中,允許的值是1901到2155和0000 。在兩位格式中,允許的值是70到69,表示從1970年到2069年。MYSQL以YYYY格式顯示YEAR值,但允許使用字符串或數字爲YEAR列分配值。

(3)字符串類型

  • CHAR[ (m) ]:定長字符串,用於保存文本格式存儲的信息,MySQL會分配固定的存儲空間來存儲CHAR,範圍是0到255個字符。
  • VARCHAR[ (m) ]:可變長字符串,用於保存文本格式存儲的信息,範圍是0到 65 535 。
  • TINYBLOB:最大長度爲255(2^8 -1)字節的BLOB列。
  • TINYTEXT:最大長度爲255(2^8 -1)字節的TEXT列。
  • BLOB[ (m) ]:最大長度爲65 535(2^16 -1)字節的BLOB列。
  • TEXT[ (m) ]:最大長度爲65 535(2^16 -1)字節的TEXT列。
  • ENUM ( ‘value1’,‘value2’,…):枚舉類型。只能有一個值的字符串被選出。ENUM列最多可以有65535個互不相同的值。ENUM值在內部用整數表示。

在字符數據類型和數值類型之後,MySQL允許指定一個數據類型選項用來改變數據類型的屬性和功能。對於字符型數據類型,MySQL支持兩種數據類型選項,即CHARACTER SET 和 COLLATE,如果要區分字符的大小寫,可以在字符類型後面加上BINGARY;對於出BIT以外的數值數據類型,MySQL允許添加一個或多個數據類型選項,UNSIGNED指定不允許負值,ZEROFILL指定當插入的值長度小於字段設定的長度時,剩餘部分用0填補。

AUTO_INCREMENT的使用
在MySQL中,關鍵字AUTO_INCREMENT用於爲列設置自增屬性,只有整形列才能設置此屬性。當插入NULL值或者數字0到一個AUTO_INCREMENT列中時,該列的值會被設置爲value+1,這裏的value是此前表中該列的最大值。AUTO_INCREMENT順序從數字1開始。每個表只能有一個AUTO_INCREMENT列,並且它必須被索引。

指定默認值
在MySQL中,默認值是指在向表中插入數據時,如果沒有明確給出某個表列所對應的值,此時MySQL允許爲此表列指定一個值。
BLOB和TEXT類型的列不能被賦予默認值。如果沒有列指定默認值,MySQL會自動爲其分配一個默認值。如果列可以取NULL值,如果列被聲明NOT NULL,那麼默認值就取決於列的類型。

  • 對於沒有聲明AUTO_INCREMENT屬性的數字類型,默認值是0;對於一個AUTO_INCREMENT列,默認值是在順序中的下一個值。
  • 除TIMESTAMP以外的日期和時間類型,默認值是該類型適當的“零”值;對於表中第一個TIMESTAMP列,默認值是當前的日期和時間。
  • 對於ENUM類型,默認值是第一個枚舉值;除ENUM的字符串類型,默認值是空字符串。

NULL值
NULL值是沒有值或缺值。允許NULL列也允許插入時不給出該列的值。不允許NULL值的列不接受該列值爲NULL,插入時必須要有值。
需要注意的是,不要講NULL值和空串混淆,NULL值是沒有值,不是空串。因此在NOT NULL中插入’’(兩個單引號,其間沒有字符)是可以的。因爲’'表示空串,而空串也是一個有效的值。

注意:NULL和空串的區別。NULL是該字段數據沒有值,而空串代表的是該字段有值。

主鍵
CREATE TABLE語句中,主鍵是通過PRIMARY KEY關鍵字來指定的。當創建或更改表時,可以通過定義PRIMARY KEY約束來創建主鍵。一個表只能有一個PRIMARY KEY約束,而且PRIMARY KEY約束中的列不接受空值。由於PRIMARY KEY約束確保唯一數據,所以經常用來定義標識列。
主鍵:一個列或列的組合,其值能唯一地表示表中的每一行。這樣的一列或多列稱爲表的主鍵,通過它可強制表的實體完整性。

引擎類型
MySQL支持多種類型的數據庫引擎,可分別根據各引擎的功能和特性,爲不同的數據庫處理任務提供各自不同的適應性和靈活性。在MySQL中,可以利用SHOW ENGINES語句來顯示可用的數據庫引擎和默認引擎。
InnoDB是系統的默認引擎,其支持可靠的事務處理。在MySQL中,可以在CREATE TABLE語句中使用ENGINE選項爲新建表指定數據庫引擎。

3.2.2 更新表

在這裏插入圖片描述
在MySQL中,可以使用ALTER TABLE語句來改變原有表的結構,增加或刪減列、創建或取消索引、更改原有列類型、重新命名列或表等。

常用語法格式如下:

ALTER TABLE<表名>[修改選項]
[修改選項]
{ADD COLUMN <列名><類型>}
|CHANGE COLUMN<舊列名><新列名><新列類型>
|ALTER COLUMN<列名>{SET DEFAULT<默認值>|DROP DEFAULT}
|MODIFY COLUMN<列名><類型>
|DROP COLUMN<列名>
|RENAME TO<新表名>}

ADD [COLUMN]子句

用於向表中增加新列,可同時增加多個列。

【例】:向表students中添加一列,並且命名爲student_from,用於描述學生的生源地,要求不能是NULL,且該列位於原表列student_sex列之後。

alter table students add column student_from char(10) not null after student_sex;

結果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 0       |                |
| student_from    | char(10) | NO   |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+

通過AFTER關鍵字想表中指定的列之後插入新列,也可以採用FIRST關鍵字將新列插入到表的第一頁。如果沒有指定AFTER或者FIRST,默認將新列插入到原表的最後。

CHANGE [COLUMN]子句

可同時修改表中指定列的名稱和數據類型。
ALTER TABLE語句中可以同時放入多個CHANGE [COLUMN]子句,彼此間用逗號分隔。

【例】將數據庫中表students的student_from列重命名爲student_city,且數據類型改爲char(20),允許爲NULL。

mysql> alter table students change column student_from student_city char(20) null;

結果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 0       |                |
| student_city    | char(20) | YES  |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

注意:如果將列的數據類型改變爲另外一種類型,可能會丟失該列原有的數據。如果視圖改變的數據類型與原有的數據類型不兼容,則SQL命令不會執行,且系統會提示錯誤。在類型兼容的情況下,該列的數據可能會被截斷。例如:數據類型從varchar(20)改爲char(2),則原有數據“Beijing”被截取爲“Be”。

ALTER [COLUMN]子句

可以修改或刪除表中指定列的默認值。

【例】將數據庫中表students的student_sex列的默認值改爲1(代表“女”)。

mysql> alter table students alter column student_sex set default 1;

結果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 1       |                |
| student_city    | char(20) | YES  |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

MODIFY [COLUMN]子句

可以修改制定列的數據類型,但是不會干涉它的列名。

【例】將數據庫中表students的student_name列的數據類型由char(50)更改爲char(20),並且將此列設置成表的第一列。

mysql> alter table students modify student_name char(20) first;

結果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_name    | char(20) | YES  |     | NULL    |                |
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_sex     | char(1)  | NO   |     | 1       |                |
| student_city    | char(20) | YES  |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

DROP [COLUMN]子句

用來刪除表中的列。

數據表中的列越多,DBMS的工作負荷會越大,數據佔用的空間也會越大,因而必要的時候需要規範數據表,刪除表中多餘的列。一旦列刪除,原本儲存在該列的一切數據都會被同時刪除。
【例】刪除表 students 的 student_contact 列。

mysql> alter table students drop column student_contact;

結果如下:

mysql> desc students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

RENAME [TO]子句

可以爲表重新賦予一個表名。

【例】重新命名錶 students 的表名爲 university_students。

mysql> alter table students rename to university_students;

結果如下:

mysql> desc university_students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.3 重命名錶

除了ALTER TABLE命令,還可以直接用RENAME TABLE語句來更改表的名字。

語法格式:

RENAME TABLE <表名> TO <新表名>

語法說明:

  • <表名>:修改之前的名字。
  • <新表名>:修改之後的名字。
  • RENAME TABLE可以同時命名多個表。

【例】使用RENAME TABLE將數據庫中的 university_students 表重新命名爲 students 。

mysql> rename table university_students to students;

結果如下:

mysql> desc students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.4 複製表

使用CREATE TABLE命令創建的語句,存在着另外一種語法結構,其實質是在舊錶的基礎上創建一份該表的拷貝,也就是複製表。

語法格式:

CREATE TABLE <表名> [LIKE | AS <就表名>]

語法說明:

  • LIKE:LIKE關鍵字可以創建一個和<舊錶>表結構相同的新表,其中列名、數據類型、空指定和索引都將複製到新表,但是表的內容不會複製,因此創建的是一個和原表結構相同的空表。
  • AS:如果在複製表結構的同時,複製表的內容,可以使用AS子句來完成。使用AS子句可以複製表的內容,但索引和完整性約束不會被複制。

【例】在數據庫中創建一份表 students 的拷貝 students_copy。

mysql> create table students_copy like students;

結果如下:

mysql> desc students_copy;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.5 刪除表

當刪除一個表的時候,可以使用DROP TABLE語句來完成。

語法格式:

DROP TABLE <表名> [, <表名1>, <表名2>]...

語法說明:

  • <表名>:被刪除的表名。DROP TABLE語句可以同時刪除多個表,用戶必須擁有該命令的權限。
  • 表被刪除時,所有的表數據和表定義會被取消,所以使用本語句要小心。
  • 表被刪除時,用戶在該表上的權限並不會自動被刪除。

【例】刪除數據庫中的表 students_copy。

mysql> drop table students_copy;

結果如下:

mysql> show tables;
+-------------------+
| Tables_in_my_test |
+-------------------+
| employee          |
| students          |
+-------------------+
2 rows in set (0.18 sec)

3.2.6 查看錶

在MySQL中,查看錶包括 顯示錶的名稱顯示錶的結構

顯示錶的名稱
可以使用SHOW TABLES語句顯示指定數據庫存放的所有表名。

語法格式:

SHOW TABLES [ FROM <數據庫名>][LIKE <模式>]

【例】顯示數據庫my_test中所有的表。

mysql> use my_test;
Database changed

mysql> show tables;
+-------------------+
| Tables_in_my_test |
+-------------------+
| employee          |
| students          |
+-------------------+
2 rows in set (0.00 sec)

顯示錶的結構
可以使用SHOW COLUMNS語句來顯示指定數據表的結構。

語法格式:

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name][LIKE 'pattern']

【例】顯示數據庫my_test中表students的結構。

mysql> show columns from students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.15 sec)

MySQL支持用DESCRIBEDESC作爲SHOW COLUMNS FROM的一種快捷方式。上述語句可以使用DESC達到同樣的效果:

mysql> desc students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.7 表結構進階

明確表的結構是成功創建表的關鍵。表的結構包含了表的名字,列名以及對應的數據類型和長度,是否可以爲空值,默認值的指定,是否要使用約束,如何設置索引,哪些列指定爲主鍵,哪些列指定爲外鍵等。這裏重點說明以下幾點:

關於空值(NULL)
通常用於表示未知、不可用或將在以後添加的數據,切不可將它和數字0或字符類型的空字符混淆。向表中插入記錄時,若一個列允許爲空值的話,則可以不爲該列指定具體的值;如果這個列不允許空值,則必須指定該列的具體值,否則插入數據庫的時候,系統會提示出錯。
注意:表的關鍵字是不允許爲空值的。任意兩個空值不相等。

關於列的標誌(IDENTITY)屬性
任何表都可以創建一個包含系統所生產序列號值的標識列。該序號值唯一標識表中的一列,且可以作爲鍵值。每個表只能有一個列設置爲標誌屬性,並且該列是能是DECIMAL、INT、NUMERIC、SMALLINT、BIGINT或TINYINT數據類型。定義標誌屬性時,可指定其中子值(起始值)、增量值,二者的默認數字均爲1 。

關於列類型的隱含改變
在MySQL中,存在下面的一些情形,系統會隱含地改變在CREATE TABLE語句或ALTER TABLE語句中所指定的列的類型。

  • 長度小於4的VARCHAR類型會被改變爲CHAR類型。
  • 只要在一個表中存在任何可變長度的列,都會使整個數據列變成變長的,因此當一張表包含任何變長的列時,如VARCHAR、TEXT、BLOB類型的列,該表中所有大於3個字符的其他CHAR類型列會被改變爲VARCHAR類型列,同時不會影響用戶如何使用這些列。這種改變的好處是節省空間,提升表操作的效率。
  • 由於TIMESTAMP類型列值的顯示尺寸必須是偶數且在2~14範圍內,若沒有爲其指定在這個範圍之內,尺寸會被強制設爲14,而1~13範圍內的奇數值尺寸會被強制設爲下一個更大的偶數。
  • 由於不能再TIMESTAMP類型列中存儲空值NULL,因此當將該列的值設爲NULL時,MySQL會默認設置爲它的當前的日期和時間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章