MySQL 超新手入門(6)CRUD 與資料維護
專欄作者新書出版:Android App程式開發剖析 第三版(適用Android 8 Oreo與Android Studio 3) MySQL 超新手入門(5)JOIN 與 UNION 查詢 << 前情 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」表格中:
你當然可以分別執行三個新增敘述將三個員工資料新增到「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」敘述的效率好一些,尤其是表格中的紀錄非常多的時候會更明顯。 |
yulin wang
01/16
感謝分享
一直都有在追蹤相關系列
周建良
03/19
有神快拜XD
有重新學MYSQL的FU
此外後續的連結要更正成(7)喔!!
elaine wu
04/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的部分