1. 程式人生 > 其它 >mysql 必知必會整理—表[十一]

mysql 必知必會整理—表[十一]

前言

簡單整理一下表和檢視。

正文

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

一般有兩種建立表的方法:

  1. 使用具有互動式建立和管理表的工具

  2. 表也可以直接用MySQL語句操縱

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

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

  1. 新表的名字,在關鍵字CREATE TABLE之後給出;

  2. 表列的名字和定義,用逗號分隔。

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語句從舊錶複製資料到新表。如果有必要,可使用轉換函式和
計算欄位;

  1. 檢驗包含所需資料的新表;

  2. 重新命名舊錶(如果確定,可以刪除它);

  3. 用舊錶原來的名字重新命名新表;

  4. 根據需要,重新建立觸發器、儲存過程、索引和外來鍵。

小心使用ALTER TABLE 使用ALTER TABLE要極為小心,應該在進行改動前做一個完整的備份(模式和資料的備份)。

資料庫表的更改不能撤銷,如果增加了不需要的列,可能不能刪除它們。

刪除表

drop table constums2.

重命名錶

使用rename table 語句:

rename table customers2 to customers1

### 結

下一節檢視。

類似地,如果刪除了不應該刪除的列,可能會丟失該列中的所有資料。