CRUD 與資料維護
1 取得表格資訊
1.1 DESCRIBE指令
「DESCRIBE」是MySQL資料庫提供的指令,它只能在MySQL資料庫中使用,這個指令可以取得某個表格的結構資訊,它的語法是這樣的:
你在MySQL的工具中執行「DESC cmdev.dept」指令以後,MySQL會傳回「cmdev.dept」表格的結構資訊:
1.2 欄位順序
每一個表格在設計的時候,都會決定它有哪一些欄位,和所有欄位的詳細設定。另外也會決定表格中的欄位順序,知道表格欄位順序在接下來的討論中是很重要的:
註:如何建立一個新的表格會在「第八章、表格與索引」中討論。
2 新增
2.1 基礎新增敘述
新增資料到資料庫的表格中使用「INSERT」敘述,下列是這個敘述的基本語法:
使用這個語法新增紀錄的時候,要特別注意表格的欄位個數與順序,下列的新增敘述會新增一筆部門的紀錄到「cmdev.dept」表格中:
除了明確的指定新增紀錄的每一個欄位資料外,你也可以使用「DEFAULT」關鍵字,讓MySQL為你寫入在設計表格的時候,為欄位指定的預設值。下列的新增敘述同樣會新增一筆部門的紀錄到「cmdev.dept」表格中,不過部門的所在位置(location)欄位值指定為使用預設值:
使用這種語法新增紀錄的時候,如果資料個數與欄位個數不一樣的話,就會發生錯誤:
資料個數雖然沒有錯,順序卻不對了,也有可能會造成錯誤:
新增敘述的另外一種語法,就提供比較靈活的新增紀錄方式,你可以自己指定新增紀錄的欄位個數和順序:
在你額外為這個新增敘述指定欄位以後,指定儲存資料的時候就要依照自己指定的欄位個數與順序:
如果沒有依照自己指定的欄位個數與順序,就會發生錯誤:
因為這種新增敘述的語法可以自己指定欄位的個數與順序,所以你只要指定寫入欄位的資料就可以了。不過要特別注意下列兩種語法的差異:
也因為這樣的規定,所以下列這個新增敘述在語法上雖然沒有錯誤,如果違反表格設計上的規定,同樣會造成錯誤:
這種新增敘述的語法還有一個比較特別的用法,如果你要新增的紀錄,所有欄位的值都要使用預設值,就可以使用下列的寫法。不過要特別注意下列的新增敘述執行以後會造成錯誤,因為「deptno」與「dname」欄位的預設值是「NULL」,可是它們又不能儲存「NULL」:
下列是新增敘述的第三種語法:
這種語法只是提供你另外一種新增紀錄的寫法,下列兩個新增敘述的效果是一樣的:
2.2 同時新增多筆紀錄
上列討論的新增敘述執行以後,都是一個敘述新增一筆紀錄,如果需要的話,你也可以在一個新增敘述新增多筆紀錄,差異只有在「VALUES」子句後面新增資料的指定:
如果你要新增下列三個員工資料到「cmdev.emp」表格中:
empno | ename | job | manager | hiredate | salary | comm | deptno |
---|---|---|---|---|---|---|---|
8001 | SIMON | MANAGER | 7369 | 2001-02-03 | 3300 | NULL | 50 |
8002 | JOHN | PROGRAMMER | 8001 | 2002-01-01 | 2300 | NULL | 50 |
8003 | GREEN | ENGINEER | 8001 | 2003-05-01 | 2000 | NULL | 50 |
你當然可以分別執行三個新增敘述將三個員工資料新增到「cmdev.emp」表格中;你也可以使用下列一個新增敘述,這個敘述執行以後,同樣會新增三筆紀錄:
2.3 索引值
在設計表格的時候,通常會視需要指定表格中的某一個欄位為「主索引」欄位:
註:一個表格除了可以設定「主索引」欄位外,資料庫還提供其它幾種不同的「索引」,索引的應用與設定會在後面「第八章、表格與索引」中詳細討論。
如果一個表格設定了某一個欄位為主索引以後,你在新增紀錄時就不可以違反主索引的規定,否則會產生錯誤:
你可以在使用「INSERT」敘述的時候,加入「IGNORE」關鍵字,它可以在執行一個違反主索引規定的新增敘述時,自動忽略新增的動作,這樣就不會產生錯誤訊息了:
2.4 索引值與ON DUPLICATE KEY UPDATE
使用「INSERT」敘述新增紀錄的時候,還可以視需要在最後搭配一串關鍵字「ON DUPLICATE KEY UPDATE」,它可以用來指定在違反重複索引值的規定時要執行的修改:
需要為「INSERT」敘述搭配「ON DUPLICATE KEY UPDATE」的情況會比較特殊一些,所以接下來會使用「cmdev.travel」這個表格來討論它的用法,「cmdev.travel」是員工資料庫中用來儲存出差資料的表格,每一個員工到某個地方出差的資料,都會儲存在這個表格中:
因為這個表格的設計方式,所以如果要處理編號「7900」的員工到「BOSTON」出差資料的話,你就要執行下列的動作:
註:修改敘述「UPDATE」在下一節討論。
你會發現要處理員工出差資料會是一件不算簡單的工作,搭配「ON DUPLICATE KEY UPDATE」的「INSERT」敘述,可以讓處理這類需求的敘述比較簡單一些:
這個「INSERT」敘述執行以後,資料庫會幫你執行需要的檢查,根據檢查的結果執行不同的動作:
2.5 「REPLACE」敘述
除了使用「INSERT」敘述新增紀錄外,「REPLACE」敘述同樣可以新增紀錄,它們的語法幾乎相同:
「INSERT」敘述的另一種寫法也可以套用給「REPLACE」敘述:
會使用「REPLACE」敘述新增紀錄的原因,主要還是考慮索引值的情況,「REPLACE」敘述在沒有違反索引值的規定時,效果跟「INSERT」敘述一樣,同樣會新增紀錄到表格中。
在發生重複索引值的時候,「INSERT」敘述會發生錯誤:
「INSERT」敘述搭配「IGNORE」關鍵字的時候:
同樣的情況改用「REPLACE」敘述的話,它會執行修改紀錄的動作:
3 修改
修改已經儲存在表格中的紀錄使用「UPDATE」敘述,下列是它的基本語法:
使用「UPDATE」敘述的時候,通常會搭配使用「WHERE」子句,用來指定要修改的紀錄:
所以你在執行「UPDATE」敘述的時候,一定要依照實際的需求,正確的設定修改的條件。以下列兩個修改敘述來說,它們執行後的差異是很大的:
3.1 搭配「IGNORE」
在使用「UPDATE」敘述的時候,也可以視需要加入「IGNORE」關鍵字,它可以防止錯誤的修改敘述出現錯誤訊息:
除了上列的情況外,你還必須特別注意修改多個欄位值的情況。首先是沒有「IGNORE」關鍵字的時候,錯誤的資料會在執行修改敘述的時候產生錯誤訊息,當然也不會執行任何修改的動作:
同樣的修改敘述加入「IGNORE」關鍵字後,執行後的結果可能會跟你想得不太一樣了:
3.2 搭配「ORDER BY」與「LIMIT」
執行修改的時候使用「WHERE」子句是一般最常見的用法,在處理一些比較特殊的修改需求時,也會搭配「ORDER BY」與「LIMIT」子句:
「LIMIT」子句也可以在查詢敘述中使用,不過在「UPDATE」敘述中使用「LIMIT」子句會有一個限制:
以同樣為員工加薪一百的需求來說,搭配「ORDER BY」與「LIMIT」子句,可以完成許多不同的情況:
4 刪除
4.1 「DELETE」敘述
刪除表格中不再需要的紀錄使用「DELETE」敘述,下列是它的語法:
使用「DELETE」敘述的時候,通常也會使用「WHERE」子句設定要刪除哪些紀錄:
執行刪除的時候也可以搭配「ORDER BY」與「LIMIT」子句:
4.2 「TRUNCATE」敘述
如果要刪除一個表格中所有的紀錄,你可以選擇使用「TRUNCATE」敘述,下列是它的語法:
要執行刪除表格中所有的紀錄,下列兩個敘述的效果是一樣的:
「TRUNCATE」敘述在執行刪除紀錄的時候,會比使用「DELETE」敘述的效率好一些,尤其是表格中的紀錄非常多的時候會更明顯。