2012-06-14 202 views
2

我有從遞減TABLEA命令輸出以下內容的表A:刪除默認約束

+---------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+---------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| name | varchar(50) | NO |  |   |    | 
| city | varchar(50) | YES |  | NULL |    | 
| state | char(2)  | YES |  | NULL |    | 
| country | varchar(30) | YES |  | NULL |    | 
| notes | longtext | YES |  | NULL |    | 
| type | varchar(50) | NO |  | NULL |    | 
+---------+-------------+------+-----+---------+----------------+ 

現在有3列有NOT NULL約束:

  1. ID
  2. 類型

對於列id和類型,我需要刪除默認約束。基本上我想要默認值:無。我不想使用變通方法,例如。爲varchar設置缺省值爲''。

和NULL,NONE之間的區別「」從這次討論Default-values-for-varchar-and-int-mysql-data-types

我用命令試圖變得更加清晰:

alter table tableA alter column type drop default; 

查詢運行正常,但沒有行受到影響。當我運行describe命令時,默認值沒有改變。

如果我將默認值設置爲'',我遇到了不同的問題 - 數據庫允許在db中輸入空字符串。對於我來說,這相當於爲列的值插入NULL,我不想允許這樣做。

我需要一些關於如何處理默認值的指導,在這種情況下,我不能允許空字符串作爲數據庫中的數據。我想提及的是,我打算在代碼中加入驗證以檢查傳入數據是空字符串還是NULL。但是,如果驗證不起作用等,我想確保數據庫可以拒絕添加這樣的數據。

任何幫助真的很感激。

+0

http://stackoverflow.com/questions/5807231/mysql-check-constraint-alternative – biziclop

回答

0

如果該列可以爲空,則默認值或空值是相同的。 所以允許爲空,則默認爲空是做說

插入(姓名,城市,類型)VALUES(「弗雷德」,DEFAULT,「白人」)

空不空字符串時除外有效無關。鑑於您在表中允許爲null,但在應用程序中將其解釋爲空字符串,則在設計中存在令人煩惱的缺陷。

如果你不想在那裏有空字符串,通常你會使用一個檢查約束,據我所知還沒有在mysql中實現。顯然這種缺乏通常是通過插入觸發器來解決的。 所以你應該檢查觸發器中的值,然後插入空字符串失敗。

PS它並沒有解決完整性問題,但如果你確實想要一種方式來將空值放入空白的時候,所以你不必區分空字符串和空值。

然後看看nullif函數。

+0

謝謝你的回覆。
我理解並且+1插入空字符串時插入觸發器的想法。不過,我不確定我是否明白你的意思寫什麼與Default值NULL相關。我理解NULL,''和None(即沒有默認值)之間的區別。我正在尋找的是找到一個解決方案,我可以從現有的列中刪除默認約束。我舉了一些我嘗試過的例子,以及爲什麼他們不適合我。我希望這些例子沒有另外的溝通。謝謝 –

+0

擺脫默認空,不會幫助你。在insert語句中跳過它,它將爲空,使用默認或空關鍵字它將爲空。唯一不會發生的情況是,如果你在其中放置了除null之外的東西,其中包含空字符串,這意味着它不會被默認。如果您想禁止空值,請將該列設置爲空,如果您想禁止空字符串使用觸發器。如果你想同時做兩件事,那麼做兩件事。 –