【问题标题】:Drop default constraint删除默认约束
【发布时间】:2012-06-18 00:47:34
【问题描述】:

我有一个 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. 身份证
  2. 姓名
  3. 类型

对于列 id 和 type,我需要删除默认约束。基本上我想要默认值:无。我不想使用变通方法,例如 .将 varchar 的默认值设置为 ''。

Default-values-for-varchar-and-int-mysql-data-typesDefault-values-for-varchar-and-int-mysql-data-types的讨论中可以更清楚地看出 NULL、NONE 和 '' 之间的区别

我尝试使用命令:

alter table tableA alter column type drop default;

查询运行良好,但没有行受到影响。当我运行 describe 命令时,默认值没有变化。

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

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

非常感谢任何帮助。

【问题讨论】:

标签: mysql


【解决方案1】:

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

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

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

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

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

那就看看nullif函数吧。

【讨论】:

  • 感谢您的回复。
    我理解并 +1 在插入空字符串时放置插入触发器的想法。但是,我不确定我是否理解您要写的与默认值 NULL 相关的内容。我理解 NULL、'' 和 None 之间的区别(即没有默认值)。我正在寻找的是找到一个解决方案,我可以从现有列中删除默认约束。我已经给出了我尝试过的例子以及为什么它们不是我的正确解决方案。我希望这些例子不是以其他方式传达的。谢谢
  • 摆脱默认空值对您没有帮助。在插入语句中跳过它,它将为空,使用默认或空关键字它将为空。唯一不会的情况是,如果您在其中放置了 null 以外的其他内容,其中包括空字符串,这意味着它不会是默认值。如果要禁止空值,请使列不为空,如果要禁止空字符串,请使用触发器。如果你想两者都做,就两者都做。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多