mysql 必知必會整理—表[十一]
前言
簡單整理一下表和檢視。
正文
MySQL不僅用於表資料操縱,而且還可以用來執行資料庫和表的所有操作,包括表本身的建立和處理。
一般有兩種建立表的方法:
-
使用具有互動式建立和管理表的工具
-
表也可以直接用MySQL語句操縱
為了用程式建立表,可使用SQL的CREATE TABLE語句。值得注意的是,在使用互動式工具時,實際上使用的是MySQL語句。但是,這些語句不是使用者編寫的,介面工具會自動生成並執行相應的MySQL語句。
為利用CREATE TABLE建立表,必須給出下列資訊:
-
新表的名字,在關鍵字CREATE TABLE之後給出;
-
表列的名字和定義,用逗號分隔。
CREATE TABLE語句也可能會包括其他關鍵字或選項,但至少要包括表的名字和列的細節。
下面的MySQL語句建立本書中所用的customers表:
處理現有的表 在建立新表時,指定的表名必須不存在,否則將出錯。
如果要防止意外覆蓋已有的表,SQL要求首先手工刪除該表(請參閱後面的小節),然後再重建它,而不是簡單地用建立表語句覆蓋它。
如果你僅想在一個表不存在時建立它,應該在表名後給出IF NOT EXISTS。這樣做不檢查已有表的模式是否與你打算建立的表模式相匹配。
它只是查看錶名是否存在,並且僅在表名不存在時建立它。
NULL值就是沒有值或缺值。允許NULL值的列也允許在插入行時不給出該列的值。不允許NULL值的列不接受該列沒有值的行,換句話說,在插入或更新行時,該列必須有值。
理解NULL 不要把NULL值與空串相混淆。NULL值是沒有值,它不是空串。
如果指定''(兩個單引號,其間沒有字元),這在NOT NULL列中是允許的。空串是一個有效的值,它不是無值。
NULL值用關鍵字NULL而不是空串指定。
那麼看下如何建立主鍵吧:
primary key(vend_id)
如果多個列組作為元件的話,可以:
AUTO_INCREMENT告訴MySQL,本列每當增加一行時自動增量。每次執行一個INSERT操作時,MySQL自動對該列增量(從而才有這個關鍵字AUTO_INCREMENT),給該列賦予下一個可用的值。
這樣給每個行分配一個唯一的cust_id,從而可以用作主鍵值。
每個表只允許一個AUTO_INCREMENT列,而且它必須被索引(如,通過使它成為主鍵)。
確定AUTO_INCREMENT值 讓MySQL生成(通過自動增量)主鍵的一個缺點是你不知道這些值都是誰。
考慮這個場景:你正在增加一個新訂單。這要求在orders表中建立一行,然後在orderitms表中對訂購的每項物品建立一行。
order_num在orderitems表中與訂單細節一起儲存。這就是為什麼orders表和orderitems表為相互關聯的表的原因。這顯然要求你在插入orders行之後,插入orderitems行之前知道生成的order_num。
那麼,如何在使用AUTO_INCREMENT列時獲得這個值呢?可使用last_insert_id()函式獲得這個值,如下所示:
此語句返回最後一個AUTO_INCREMENT值,然後可以將它用於後續的MySQL語句。
但是如果是併發的情況下,那麼這樣還是有問題的,這個時候最好生成orderid。
如果在插入行時沒有給出值,MySQL允許指定此時使用的預設值。
預設值用CREATE TABLE語句的列定義中的DEFAULT關鍵字指定。
如果我們建立表的時候需要使用預設值的話,可以這樣:
default 1; 這樣預設值就是1了。
不允許函式 與大多數DBMS不一樣,MySQL不允許使用函式作為預設值,它只支援常量。
使用預設值而不是NULL值 許多資料庫開發人員使用預設值而不是NULL列,特別是對用於計算或資料分組的列更是如此。
你可能已經注意到,迄今為止使用的CREATE TABLE語句全都以ENGINE=InnoDB語句結束。
與其他DBMS一樣,MySQL有一個具體管理和處理資料的內部引擎。
在你使用CREATE TABLE語句時,該引擎具體建立表,而在你使用SELECT語句或進行其他資料庫處理時,該引擎在內部處理你的請求。
多數時候,此引擎都隱藏在DBMS內,不需要過多關注它。但MySQL與其他DBMS不一樣,它具有多種引擎。
它打包多個引擎,這些引擎都隱藏在MySQL伺服器內,全都能執行CREATE TABLE和SELECT等命令。
外來鍵不能跨引擎 混用引擎型別有一個大缺陷。外來鍵(用於
強制實施引用完整性,如第1章所述)不能跨引擎,即使用一
個引擎的表不能引用具有使用不同引擎的表的外來鍵。
更新表
為更新表定義,可使用ALTER TABLE語句。但是,理想狀態下,當表中儲存資料以後,該表就不應該再被更新。
在表的設計過程中需要花費大量時間來考慮,以便後期不對該表進行大的改動。
為了使用ALTER TABLE更改表結構,必須給出下面的資訊:
1.在ALTER TABLE之後給出要更改的表名(該表必須存在,否則將
出錯);
2.所做更改的列表。
增加一列:
ALTER TABLE vendors
ADD vend_phone CHAR(20) NULL
然後刪除一列:
ALTER TABLE vendors
DROP COLUMN vend_phone;
ALTER TABLE的一種常見用途是定義外來鍵。下面是用來定義本書中的表所用的外來鍵的程式碼:
ALTER TABLE orderitems
ADD CONSTRAINT fk_orderitems_orders
FOREIGN KEY (order_num) REFERENCES orders(order_num)
複雜的表結構更改一般需要手動刪除過程,它涉及以下步驟:
1.用新的列布局建立一個新表;
2.使用INSERT SELECT語句從舊錶複製資料到新表。如果有必要,可使用轉換函式和
計算欄位;
-
檢驗包含所需資料的新表;
-
重新命名舊錶(如果確定,可以刪除它);
-
用舊錶原來的名字重新命名新表;
-
根據需要,重新建立觸發器、儲存過程、索引和外來鍵。
小心使用ALTER TABLE 使用ALTER TABLE要極為小心,應該在進行改動前做一個完整的備份(模式和資料的備份)。
資料庫表的更改不能撤銷,如果增加了不需要的列,可能不能刪除它們。
刪除表
drop table constums2.
重命名錶
使用rename table 語句:
rename table customers2 to customers1
### 結
下一節檢視。
類似地,如果刪除了不應該刪除的列,可能會丟失該列中的所有資料。