2012-06-14 240 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之外的东西,其中包含空字符串,这意味着它不会被默认。如果您想禁止空值,请将该列设置为空,如果您想禁止空字符串使用触发器。如果你想同时做两件事,那么做两件事。 –