删除默认约束

时间:2012-06-14 22:44:18

标签: mysql

我有一个tableA,其中包含来自desc tableA命令的输出:

+---------+-------------+------+-----+---------+----------------+
| 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. 名称
  3. 对于列id和类型,我需要删除默认约束。基本上我想要默认:无。我不想使用解决方法,例如。为varchar设置默认值为''。

    从这个讨论Default-values-for-varchar-and-int-mysql-data-types

    可以更清楚地看出NULL,NONE和''之间的区别

    我尝试使用命令:

    alter table tableA alter column type drop default;
    

    查询运行正常,但没有行受到影响。当我运行describe命令时,不显示默认值的变化。

    如果我将默认值设置为''我遇到了不同的问题 - 数据库允许在db中输入空字符串。对我来说,这相当于为列的值插入NULL,我不想允许这样做。

    在这种情况下我需要一些关于如何处理默认值的指导,我不能在数据库中允许空字符串作为数据。我想提一下,我打算在代码中放置验证来检查传入的数据是空字符串还是NULL。但是,如果验证不起作用等,我想确保数据库可以拒绝添加此类数据。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果列可以为null,则default或null都相同。 所以Allowed Null,Default null实际上是无关紧要的,除非在说

插入(名称,城市,类型)值('Fred',DEFAULT,'高加索')

Null不是空字符串。鉴于您在表中允许null但在应用程序中将其解释为空字符串,您的设计中存在恼人的缺陷。

如果你不想在那里使用空字符串,通常你会使用一个检查约束,据我所知仍然没有在mysql中实现。显然,这种缺乏通常通过插入触发器来解决。 所以你要检查触发器中的值,然后插入空字符串失败。

PS它没有解决完整性问题,但如果你确实想要一种方法在一个straing为空时放入空值,那么你就不必区分空字符串和null。

然后看看nullif函数。