【问题标题】:Modify SQL column field to be nullable, if I added constraint do I need to remove constraint as well?将 SQL 列字段修改为可为空,如果我添加了约束,我是否还需要删除约束?
【发布时间】:2019-09-13 16:08:28
【问题描述】:

我用以下脚本修改了一个表

ALTER TABLE TABLENAME ADD [flagField] CHAR(1) DEFAULT 'N' NOT NULL;
ALTER TABLE TABLENAME ADD CONSTRAINT XCK6_tablename CHECK([flagField] in ('Y', 'N'));

如果我想反转此脚本以更改表中的该字段以允许可空状态,是否需要在使该字段可空之前删除约束?

所以如果我运行

ALTER TABLE TABLENAME ALTER COLUMN fieldFlag CHAR(1) NULL

这样可以吗,还是我也应该删除约束?

【问题讨论】:

  • 您使用的是 MySQL 8+ 吗?如果没有,检查约束甚至不起作用。
  • 支票不应该被(永久)删除。但是,它仍然会阻止 NULL 被插入,除非它被更新为允许这样。
  • ALTER TABLE TABLENAME ALTER [flagField] CHAR(1) DEFAULT NULL; ALTER TABLE TABLENAME ALTER CONSTRAINT XCK6_tablename CHECK([flagField] in ('Y', 'N',null));
  • @dxlachx 。 . .您的语法看起来像 SQL Server,而不是 MySQL。虽然这不会影响答案(在这种情况下),但您应该正确标记您的问题。
  • @GordonLinoff 你说得对,我很抱歉——已修复

标签: sql sql-server null constraints alter


【解决方案1】:

您只需将字段设为NULLable。

约束的逻辑不同于WHERECASE WHEN 条件的逻辑。对于WHERECASE WHENNULL 结果被视为假。

CHECK 正在验证数据。它接受任何不是明确为假的东西。因此,没有必要在约束中包含NULL 签入。

如果你这样做了,正确的逻辑是:

CHECK (flagField in ('Y', 'N') or flagField is null)

Here 是一个 dbfiddle,说明行为如上所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多