【问题标题】:SQL Not Null contraint on entire table对整个表的 SQL Not Null 约束
【发布时间】:2011-09-28 13:48:40
【问题描述】:

我想知道是否有任何方法可以创建一个可以应用于表中所有属性的 Not Null 约束。我知道我可以在每一行中添加一个,但我只是想学习提高效率。我尝试在线搜索,但没有找到有关此主题的任何内容。

谢谢!

更多信息:

我想我的问题可以概括为“有没有办法定义表范围或数据库范围的约束?”。对于整个数据库,我需要将每个 varchar 的默认值设置为 ''(空字符串),但现在我正在为每个 varchar 手动执行此操作。

再一次,我已经做了大部分,但似乎应该有办法避免这种重复。

【问题讨论】:

  • 一些 DBMS 支持 DOMAIN(也称为“用户定义的数据类型”),您可以在其中将此类限制置于中心位置。但 MySQL 没有。因此,您要么需要坚持为每一列重复此信息,要么考虑迁移,例如到 PostgreSQL

标签: mysql sql database ddl


【解决方案1】:

来自http://dev.mysql.com/doc/refman/5.1/en/create-table.html - 唯一可以放置 null/not null 的地方是列上。

column_definition:
    data_type [NOT NULL | NULL] [DEFAULT default_value]
      [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
      [COMMENT 'string']
      [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
      [STORAGE {DISK|MEMORY|DEFAULT}]
      [reference_definition]

IMO,确实没有理由有表约束。 DDL 指定对每列中数据的约束,而不是列定义本身。虽然有人可能想把它作为语法糖,但似乎有缺点 - 1)添加一个新列,您可能必须更改表约束 2)MySQL 默认为 NULL,这可能会导致混淆

【讨论】:

  • 不是我希望的答案,但我想它就是这样。我的意思是结果,而不是你的建议
【解决方案2】:

不,没有任何方法可以做到这一点。您必须在列级别指定它,但这是您只做一次的事情。也许是每列更多的击键或单击一次。没有效率低下。

【讨论】:

  • 我知道这并没有太多的工作,我可能花了更多的时间来问这个问题,然后我做了工作——但这​​不是我问的目的。我希望有更好的方法,仅此而已。
  • @hbtest 我明白了,你的问题在你编辑之后是一个有效的问题。顺便说一句:我不会使用空字符串来表示缺少值。 NULL 更适合这个目的。
  • 给我的要求,不是我的选择
  • @lcarus 抱歉,我知道你给出了相同的答案,但 spin_plate 向我展示了原因。
  • @hbtest 正如我们用西班牙语所说:“Al César lo que es del César”。不用道歉,他的回答更好。我也投了赞成票。
【解决方案3】:

您是否考虑过triggersstored procedures?这完全取决于您的 DBMS。但它也增加了数据库中的过度工作。

忘记CHECK 子句,因为mySql 忽略它。

【讨论】:

  • 您能解释一下多列约束吗? (我知道我可以查找它们,但我认为将其放在此处供其他人查看会增加问题的完整性)
  • @UdoFholl:实际上几乎所有的 DBMS 都支持 CHECK 约束。 AFAIK MySQL 和 SQLite 可能是 only 不支持它们的。
猜你喜欢
  • 1970-01-01
  • 2017-03-01
  • 2014-01-28
  • 1970-01-01
  • 2014-11-27
  • 2018-03-20
  • 2015-04-22
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多