MySQL 超新手入門(6)CRUD 與資料維護 by Michael | CodeData
top

MySQL 超新手入門(6)CRUD 與資料維護

分享:

專欄作者新書出版:Android App程式開發剖析 第三版(適用Android 8 Oreo與Android Studio 3)

MySQL 超新手入門(5)JOIN 與 UNION 查詢 << 前情

1 取得表格資訊

1.1 DESCRIBE指令

「DESCRIBE」是MySQL資料庫提供的指令,它只能在MySQL資料庫中使用,這個指令可以取得某個表格的結構資訊,它的語法是這樣的:

mysql_06_snap_01

你在MySQL的工具中執行「DESC cmdev.dept」指令以後,MySQL會傳回「cmdev.dept」表格的結構資訊:

mysql_06_snap_02

1.2 欄位順序

每一個表格在設計的時候,都會決定它有哪一些欄位,和所有欄位的詳細設定。另外也會決定表格中的欄位順序,知道表格欄位順序在接下來的討論中是很重要的:

mysql_06_snap_03

註:如何建立一個新的表格會在「第八章、表格與索引」中討論。

2 新增

2.1 基礎新增敘述

新增資料到資料庫的表格中使用「INSERT」敘述,下列是這個敘述的基本語法:

mysql_06_snap_04

使用這個語法新增紀錄的時候,要特別注意表格的欄位個數與順序,下列的新增敘述會新增一筆部門的紀錄到「cmdev.dept」表格中:

mysql_06_snap_05

除了明確的指定新增紀錄的每一個欄位資料外,你也可以使用「DEFAULT」關鍵字,讓MySQL為你寫入在設計表格的時候,為欄位指定的預設值。下列的新增敘述同樣會新增一筆部門的紀錄到「cmdev.dept」表格中,不過部門的所在位置(location)欄位值指定為使用預設值:

mysql_06_snap_06

使用這種語法新增紀錄的時候,如果資料個數與欄位個數不一樣的話,就會發生錯誤:

mysql_06_snap_07

資料個數雖然沒有錯,順序卻不對了,也有可能會造成錯誤:

mysql_06_snap_08

新增敘述的另外一種語法,就提供比較靈活的新增紀錄方式,你可以自己指定新增紀錄的欄位個數和順序:

mysql_06_snap_09

在你額外為這個新增敘述指定欄位以後,指定儲存資料的時候就要依照自己指定的欄位個數與順序:

mysql_06_snap_10

如果沒有依照自己指定的欄位個數與順序,就會發生錯誤:

mysql_06_snap_11

因為這種新增敘述的語法可以自己指定欄位的個數與順序,所以你只要指定寫入欄位的資料就可以了。不過要特別注意下列兩種語法的差異:

mysql_06_snap_12

也因為這樣的規定,所以下列這個新增敘述在語法上雖然沒有錯誤,如果違反表格設計上的規定,同樣會造成錯誤:

mysql_06_snap_13

這種新增敘述的語法還有一個比較特別的用法,如果你要新增的紀錄,所有欄位的值都要使用預設值,就可以使用下列的寫法。不過要特別注意下列的新增敘述執行以後會造成錯誤,因為「deptno」與「dname」欄位的預設值是「NULL」,可是它們又不能儲存「NULL」:

mysql_06_snap_14

下列是新增敘述的第三種語法:

mysql_06_snap_15

這種語法只是提供你另外一種新增紀錄的寫法,下列兩個新增敘述的效果是一樣的:

mysql_06_snap_16

2.2 同時新增多筆紀錄

上列討論的新增敘述執行以後,都是一個敘述新增一筆紀錄,如果需要的話,你也可以在一個新增敘述新增多筆紀錄,差異只有在「VALUES」子句後面新增資料的指定:

mysql_06_snap_17

如果你要新增下列三個員工資料到「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」表格中;你也可以使用下列一個新增敘述,這個敘述執行以後,同樣會新增三筆紀錄:

mysql_06_snap_18

2.3 索引值

在設計表格的時候,通常會視需要指定表格中的某一個欄位為「主索引」欄位:

mysql_06_snap_19

註:一個表格除了可以設定「主索引」欄位外,資料庫還提供其它幾種不同的「索引」,索引的應用與設定會在後面「第八章、表格與索引」中詳細討論。

如果一個表格設定了某一個欄位為主索引以後,你在新增紀錄時就不可以違反主索引的規定,否則會產生錯誤:

mysql_06_snap_20

你可以在使用「INSERT」敘述的時候,加入「IGNORE」關鍵字,它可以在執行一個違反主索引規定的新增敘述時,自動忽略新增的動作,這樣就不會產生錯誤訊息了:

mysql_06_snap_21

2.4 索引值與ON DUPLICATE KEY UPDATE

使用「INSERT」敘述新增紀錄的時候,還可以視需要在最後搭配一串關鍵字「ON DUPLICATE KEY UPDATE」,它可以用來指定在違反重複索引值的規定時要執行的修改:

mysql_06_snap_22

需要為「INSERT」敘述搭配「ON DUPLICATE KEY UPDATE」的情況會比較特殊一些,所以接下來會使用「cmdev.travel」這個表格來討論它的用法,「cmdev.travel」是員工資料庫中用來儲存出差資料的表格,每一個員工到某個地方出差的資料,都會儲存在這個表格中:

mysql_06_snap_23

因為這個表格的設計方式,所以如果要處理編號「7900」的員工到「BOSTON」出差資料的話,你就要執行下列的動作:

mysql_06_snap_24

註:修改敘述「UPDATE」在下一節討論。

你會發現要處理員工出差資料會是一件不算簡單的工作,搭配「ON DUPLICATE KEY UPDATE」的「INSERT」敘述,可以讓處理這類需求的敘述比較簡單一些:

mysql_06_snap_25

這個「INSERT」敘述執行以後,資料庫會幫你執行需要的檢查,根據檢查的結果執行不同的動作:

mysql_06_snap_26

2.5 「REPLACE」敘述

除了使用「INSERT」敘述新增紀錄外,「REPLACE」敘述同樣可以新增紀錄,它們的語法幾乎相同:

mysql_06_snap_27

「INSERT」敘述的另一種寫法也可以套用給「REPLACE」敘述:

mysql_06_snap_28

會使用「REPLACE」敘述新增紀錄的原因,主要還是考慮索引值的情況,「REPLACE」敘述在沒有違反索引值的規定時,效果跟「INSERT」敘述一樣,同樣會新增紀錄到表格中。

在發生重複索引值的時候,「INSERT」敘述會發生錯誤:

mysql_06_snap_29

「INSERT」敘述搭配「IGNORE」關鍵字的時候:

mysql_06_snap_30

同樣的情況改用「REPLACE」敘述的話,它會執行修改紀錄的動作:

mysql_06_snap_31

3 修改

修改已經儲存在表格中的紀錄使用「UPDATE」敘述,下列是它的基本語法:

mysql_06_snap_32

使用「UPDATE」敘述的時候,通常會搭配使用「WHERE」子句,用來指定要修改的紀錄:

mysql_06_snap_33

所以你在執行「UPDATE」敘述的時候,一定要依照實際的需求,正確的設定修改的條件。以下列兩個修改敘述來說,它們執行後的差異是很大的:

mysql_06_snap_34

3.1 搭配「IGNORE」

在使用「UPDATE」敘述的時候,也可以視需要加入「IGNORE」關鍵字,它可以防止錯誤的修改敘述出現錯誤訊息:

mysql_06_snap_35

除了上列的情況外,你還必須特別注意修改多個欄位值的情況。首先是沒有「IGNORE」關鍵字的時候,錯誤的資料會在執行修改敘述的時候產生錯誤訊息,當然也不會執行任何修改的動作:

mysql_06_snap_36

同樣的修改敘述加入「IGNORE」關鍵字後,執行後的結果可能會跟你想得不太一樣了:

mysql_06_snap_37

3.2 搭配「ORDER BY」與「LIMIT」

執行修改的時候使用「WHERE」子句是一般最常見的用法,在處理一些比較特殊的修改需求時,也會搭配「ORDER BY」與「LIMIT」子句:

mysql_06_snap_38

「LIMIT」子句也可以在查詢敘述中使用,不過在「UPDATE」敘述中使用「LIMIT」子句會有一個限制:

mysql_06_snap_39

以同樣為員工加薪一百的需求來說,搭配「ORDER BY」與「LIMIT」子句,可以完成許多不同的情況:

mysql_06_snap_40

4 刪除

4.1 「DELETE」敘述

刪除表格中不再需要的紀錄使用「DELETE」敘述,下列是它的語法:

mysql_06_snap_41

使用「DELETE」敘述的時候,通常也會使用「WHERE」子句設定要刪除哪些紀錄:

mysql_06_snap_42

執行刪除的時候也可以搭配「ORDER BY」與「LIMIT」子句:

mysql_06_snap_43

4.2 「TRUNCATE」敘述

如果要刪除一個表格中所有的紀錄,你可以選擇使用「TRUNCATE」敘述,下列是它的語法:

mysql_06_snap_44

要執行刪除表格中所有的紀錄,下列兩個敘述的效果是一樣的:

mysql_06_snap_45

「TRUNCATE」敘述在執行刪除紀錄的時候,會比使用「DELETE」敘述的效率好一些,尤其是表格中的紀錄非常多的時候會更明顯。

後續 >> MySQL 超新手入門(7)字元集與資料庫

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

yulin wang01/16

感謝分享
一直都有在追蹤相關系列

周建良03/19

有神快拜XD
有重新學MYSQL的FU
此外後續的連結要更正成(7)喔!!

elaine wu04/19

抱歉請問,DESC cmdev.dept這個指令是在打在tools/start shell for mysql utilies 所開啟的dos視窗嗎?

黃小天07/25

http://chingsoo.pixnet.net/blog/post/292464274-%5Bmysql%5D-%E9%97%9C%E9%96%89safe-update-mode

關於Update的部分

熱門論壇文章

熱門技術文章