有時,希望除去某些記錄或更改它們的內容。DELETE 和UPDATE語句令我們能做到這一點。
DELETE 語句有如下格式:
DELETE FROM tbl_nameWHERE 要刪除的記錄
WHERE 子句指定哪些記錄應該刪除。它是可選的,但是如果不選的話,將會刪除所有的記錄。這意味著最簡單的DELETE 語句也是最危險的。
DELETE FROM tb1_name
這個查詢將清除表中的所有內容。一定要當心!為了刪除特定的記錄,可用WHERE 子句來選擇所要刪除的記錄。這類似於SELECT 語
句中的WHERE 子句。例如,為了刪除president 表中所有出生在Ohio 的總統記錄,可用下列查詢:
DELETE 語句中的WHERE 子句的一個限制是只能夠引用要刪除記錄的表中的列。在發布DELETE 語句以前,最好用SELECT 語句測試一下相應的WHERE 子句以確保實際刪除的記錄就是確實想要刪除的記錄(而且只刪除這些記錄)。假如想要刪除Te d d yRoosevelt 的記錄。下面的查詢能完成這項工作嗎?
是的,感覺上它能刪除您頭腦中打算刪除的記錄。但是,錯了,實際上它也能刪除Franklin Roosevelt 的記錄。如果首先用WHERE 子句檢查一下就安全了,如下所示:
現在我們明白了能選擇出所需記錄的WHERE 子句了,因此DELETE 查詢可正確地構造如下:
似乎刪除一個記錄需要做許多工作,不是嗎?但是安全第一!(如果想使鍵盤輸入工作盡量少,可利用拷貝和粘貼技術或采用輸入行編輯技術。更詳細的信息,請參閱“與MySQL交互的技巧”一節。)為了修改現有記錄,可利用UPDATE語句,它具有下列格式:
UPDATEt b l_name SET 要更改的列WHERE 要更新的記錄這裡的WHERE 子句正如DELETE 語句一樣,是可選的,因此如果不指定的話,表中的每個記錄都被更新。下面的查詢將每個學生的名字都更改為“ G e o rg e”:
顯然,對於這樣的查詢必須極為小心。一般對正在更新的記錄要更為小心。假定近來增加了一個新記錄到歷史同盟,但是只填寫了此實體的少數幾個列:
然後意識到忘了設置其會員終止日期。那麼可如下進行設置:
可同時更新多個列。下面的語句將更新Jerome 的電子郵件和通信地址:
還可以通過設置某列的值為NULL(假設此列允許NULL 值)“不設置”此列。如果在未來的某個時候Jerome 決定支付成為終生會員的會員資格更新費,那麼可以設置其記錄的終止日期為NULL(“永久”)以標記他為終生會員。具體設置如下:
正如DELETE 語句一樣,對於UPDATE,用SELECT 語句測試WHERE 子句以確保選擇正確的更新記錄是一個好辦法。如果選擇條件范圍太窄或太寬,就會使更新的記錄太少或太多。如果您試驗過本節中的查詢,那麼必定已經刪除和修改了samp_db 表中的記錄。在繼續學習下一節的內容以前,應該撤消這些更改。按1. 4 . 7節“增加新記錄”最後的說明重新裝載表的內容來完成這項工作。
1.4.10 改變表的結構
回顧我們創建歷史同盟member 表時缺了一個會員號列,因此我們可以進行一次ALTE RTABLE 語句的練習。需要用ALTER TABLE,可以對表重新命名,增加或刪除列,更改列的類型等等。這裡給出的例子是關於怎樣增加新列的。有關ALTER TABLE 功能的詳細內容,請參閱第3章。增加會員號列到member 表的主要考慮是,其值應該是唯一的,以免各會員條目混淆。AUTO_INCREMENT 列在此是很有用的,因為我們可以在增加新的號碼時令MySQL自動地生成唯一的號碼。在CREATE TABLE 語句中,這樣一個列的說明如下:
對於ALTER TABLE,相應的句法也是類似的。可執行下列查詢增加該列:
我們已經有一個存放會員號的列,現在怎樣分配會員號給member 表中的現有記錄呢?很容易!MySQL已經做了這項工作。在增加一列到某個表時, MySQL將會用缺省值初始化該列值。對於AUTO_INCREMENT 列,每個行將會產生一個新的順序號。