2009-08-30 82 views
1

我有一個已設置爲允許Null的字段,但我現在想要將其更改爲不允許Null。MySQL從零空間變爲非空

當我試圖改變這個我不能,因爲PhpMyAdmin已經將所有以前的記錄設置爲空。

我該如何解決這個問題?

是否有一個查詢,我可以把這將刪除所有的空值,並將字段設置爲非空?

回答

5

當然。但是,你是什麼意思「刪除所有的NULL值?」這是否意味着要刪除該字段中具有NULL的所有行?如果是這樣,你可以這樣做:

DELETE FROM your_table WHERE your_field IS NULL; 

如果您想保留這些行,你得把一些其他的價值在這一領域。有沒有道理?如果你想保留的行

UPDATE your_table SET your_field = 42 WHERE your_field IS NULL; 

(其中,當然,42是要改用任何值。)

,並沒有任何:如果是這樣,你可以這樣做其他值可以使用,那麼現在有的NULL應該保留,現在可能需要重新評估爲什麼要將字段設置爲NOT NULL

+0

+1; NULL不僅僅是一個特殊值的懶惰佔位符,它表明缺少一個值,並且在設計良好的數據庫中,這具有一定的意義。 – Rob 2009-08-30 14:25:16

+0

+1,用於提示42作爲佔位符值。並理解'null'。 – Eric 2009-08-30 14:27:46

0
UPDATE my_precious_table 
SET stinky_field TO my_favourite_non_null_value 
WHERE stinky_field IS NULL; 
2

你似乎有點困惑,至於什麼是空的真的。以下是我在其他地方發佈的文章,應該可以安全地在此重新發布:

Null表示沒有預定義的值。

當在數據庫中的表中創建列時,可以添加一些約束條件。其中一個限制是否更高,列允許空值。

如果行中的某個字段未明確設置爲其他字段,則該字段爲空。您可以在創建表時提供​​默認值,也可以在向表中添加新行時設置值,或稍後更新行。要添加或更新表中的行,使用INSERT和UPDATE命令。

當一個字段爲空時,所有與該字段的比較也將爲空。這意味着,當一個空值所涉及的所有布爾代數行爲不端: *真正的和空是空 *假和空是空

等等...

普通數學不工作,要麼因爲5 +空等於空。

這樣做的一個有趣的副作用是,當您比較兩個都爲空的字段時,結果將不爲真,它將爲空。

要仍然能夠處理可以包含空值的字段,有幾個選項:T-SQL(Microsoft SQL Server)和MySql都具有函數COALESCE()和ISNULL()。

ISNULL():如果您正在查找的值爲空,則返回預定義的值。SELECT ISNULL(NULL,2)將返回2

COALESCE():返回在預定義的列表不爲空的第一值:SELECT COALESCE(A,B,C,d ...)

在MySql還有一個空安全比較運算符:a < => b如果兩個值均爲空,則返回1(true),如果任一值爲null,則返回0(false)。

當涉及到表中的計算行你也需要知道空的含義。 SELECT COUNT(*)FROM TableName將返回表中的總行數,但SELECT COUNT(FieldName)FROM TableName將僅返回列'FieldName'不爲null的行數。

常常數據庫設計,通過lazyness或多或少,設置所有列的默認值在表或限制所有精密組件不允許空。當數據庫設計者確實使用數據庫的每個人都被迫構成'魔術'值時,就沒有實際的價值可供使用。

假設我們有一個表,用於存儲車輛信息和在該表中,我們有一個列來存儲每個存儲的車輛的燃料類型。什麼樣的燃料應該用於自行車?如果該列允許爲空,則答案很簡單;由於自行車上沒有發動機,因此無需使用燃料類型,因此只需在所有代表自行車的行上將字段設置爲空。如果數據庫設計人員將禁忌置於不允許null的列上,則開發人員必須設置一個值來表示「無燃料類型」。如果該字段是一個整數零可能會用來做到這一點。此外,如果有一個表格包含車輛表應該參考的所有可行的燃料類型,以查找燃料類型的名稱和描述,則開發人員必須在表格中放置假燃料類型,以便數據庫管理服務器可以執行數據數據庫的完整性。

空是該地段的「普通」的編程語言不具有數據庫的一個很不錯的功能,但一個數據庫開發人員,設計人員需要跟蹤在何處以及如何使用它的。

+0

我誠實地通讀了一遍,雖然我可以證實這是真的,但哪一段的目的是回答「問題是否存在......」部分? – Zed 2009-08-30 15:09:39

+0

FWIW,還有一個SQL-99謂詞'IS [NOT] DISTINCT FROM'工作方式類似於MySQL的專有''<=>操作。 PostgreSQL,IBM DB2和Firebird支持'IS [NOT] DISTINCT FROM'。 – 2009-08-30 15:41:02

+0

實際上沒有,但問題要求一種方法來刪除空值,並且我得到了他根本不會問的感覺,如果他掌握了null是什麼。 – idstam 2009-08-30 20:56:11