2

我有一个 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 命令时,默认值没有显示变化。

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

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

非常感谢任何帮助。

4

1 回答 1

0

如果该列可以为空,则默认值或空值都是相同的。所以允许空,默认空实际上是无关紧要的,除非说

插入(名称,城市,类型)值('Fred',DEFAULT,'Caucasian')

Null 不是空字符串。假设您在表中允许 null 但在应用程序中将其解释为空字符串,那么您的设计中有一个令人讨厌的缺陷。

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

PS它不能解决完整性问题,但是如果您确实想要一种在应变为空时放入空值的方法,那么您不必区分空字符串和空值。

然后看看 nullif 函数。

于 2012-06-14T23:38:56.080 回答