我有一个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约束:
对于列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。但是,如果验证不起作用等,我想确保数据库可以拒绝添加此类数据。
非常感谢任何帮助。
答案 0 :(得分:0)
如果列可以为null,则default或null都相同。 所以Allowed Null,Default null实际上是无关紧要的,除非在说
时插入(名称,城市,类型)值('Fred',DEFAULT,'高加索')
Null不是空字符串。鉴于您在表中允许null但在应用程序中将其解释为空字符串,您的设计中存在恼人的缺陷。
如果你不想在那里使用空字符串,通常你会使用一个检查约束,据我所知仍然没有在mysql中实现。显然,这种缺乏通常通过插入触发器来解决。 所以你要检查触发器中的值,然后插入空字符串失败。
PS它没有解决完整性问题,但如果你确实想要一种方法在一个straing为空时放入空值,那么你就不必区分空字符串和null。
然后看看nullif函数。