Like Share Discussion Bookmark Smile

J.J. Huang   2020-07-14   MySQL   瀏覽次數:

MySQL - 第二十三章 | 建立表(上)

建立表

MySQL不僅用於表資料操縱,而且還可以用來執行資料庫和表的所有操作,包括表本身的建立和處理。一般有兩種建立表的方法:

  • 使用具有交互式建立和管理表的工具;
  • 表也可以直接用MySQL語句操縱。

為了用程序建立表,可使用SQL的CREATE TABLE語句。值得注意的是,在使用交互式工具時,實際上使用的是MySQL語句。但是,這些語句不是用戶編寫的,界面工具會自動生成並執行相應的MySQL語句。

表建立基礎

為利用CREATE TABLE建立表,必須給出下列訊息:

  • 新表的名字,在關鍵字CREATE TABLE之後給出;
  • 表列的名字和定義,用逗號分隔。

CREATE TABLE語句也可能會包括其他關鍵字或選項,但至少要包括表的名字和列的細節。

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL ,
PRIMARY KEY (cust_id)
) ENGINE=InnoDB;

分析:從上面的例子中可以看到,表名緊跟在CREATE TABLE關鍵字後面。實際的表定義(所有列)括在圓括號之中。各列之間用逗號分隔。這個表由9列組成。每列的定義以列名(它在表中必須是唯一的)開始,後跟列的資料類型。表的主鍵可以在建立表時用PRIMARY KEY關鍵字指定。這裡,列cust_id指定作為主鍵列。整條語句由右圓括號後的分號結束。(現在先忽略ENGINE=InnoDB和 AUTO_INCREMENT,後面會對它們進行介紹。)

提示:語句格式化 以前說過MySQL語句中忽略空格。語句可以在一個長行上輸入,也可以分成許多行。它們的作用都相同。這允許你以最適合自己的方式安排語句的格式。前面的CREATE TABLE語句就是語句格式化的一個很好的例子,它被安排在多個行上,其中的列定義進行了恰當的縮進,以便閱讀和編輯。以何種縮進格式安排SQL語句沒有規定,但我強烈推薦採用某種縮進格式。

提示:處理現有的表 在建立新表時,指定的表名必須不存在,否則將出錯。如果要防止意外覆蓋已有的表,SQL要求首先手工刪除該表,然後再重建它,而不是簡單地用建立表語句覆蓋它。如果你僅想在一個表不存在時建立它,應該在表名後給出IF NOT EXISTS。這樣做不檢查已有表的模式是否與你打算建立的表模式相匹配。它只是查看表名是否存在,並且僅在表名不存在時建立它。

使用NULL值

NULL值就是沒有值或缺值。允許NULL值的列也允許在插入行時不給出該列的值。不允許NULL值的列不接受該列沒有值的行,換句話說,在插入或更新行時,該列必須有值。
每個表列或者是NULL列,或者是NOT NULL列,這種狀態在建立時由表的定義規定。

1
2
3
4
5
6
7
CREATE TABLE orders
(
order_num int NOT NULL AUTO_INCREMENT,
order_date datetime NOT NULL ,
cust_id int NOT NULL ,
PRIMARY KEY (order_num)
) ENGINE=InnoDB;

分析:這條語句建立orders表。orders包含3個列,分別是訂單號、訂單日期和客戶ID。所有3個列都需要,因此每個列的定義都含有關鍵字NOT NULL。這將會阻止插入沒有值的列。如果試圖插入沒有值的列,將返回錯誤,且插入失敗。

將建立混合了NULL和NOT NULL列的表。

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE vendors
(
vend_id int NOT NULL AUTO_INCREMENT,
vend_name char(50) NOT NULL ,
vend_address char(50) NULL ,
vend_city char(50) NULL ,
vend_state char(5) NULL ,
vend_zip char(10) NULL ,
vend_country char(50) NULL ,
PRIMARY KEY (vend_id)
) ENGINE=InnoDB;

分析:這條語句建立本書中使用的vendors表。供應商ID和供應商名字列是必需的,因此指定為NOT NULL。其餘5個列全都允許NULL值,所以不指定NOT NULL。NULL為預設設置,如果不指定NOT NULL,則認為指定的是NULL。

理解NULL 不要把NULL值與空串相混淆。NULL值是沒有值,它不是空串。如果指定’’(兩個單引號,其間沒有字符),這在NOT NULL列中是允許的。空串是一個有效的值,它不是無值。NULL值用關鍵字NULL而不是空串指定。

結語

建立表的時候,要將業務邏輯需求確認清楚再來建立,不然絕對會一改在改,有時候甚至會需要整個重新設計;在設計過程中,要對每個欄位的類型定義清楚,其中需要注意到NULL和NOT NULL的設定,不然在寫入資料的時候,會常常發生錯誤。

註:以上參考了
MySQL必知必会 MySQL Crash Course