【TechTarget中国原创】问:我已经将一个列修改成为非null列。我对这个表进行了备份,删去了以前修改过的列。现在我怎样才能登录这个表?
答:这个问题提得很好。它涉及到了很多的问题。首先,也是最重要的一点就是如果你要还原备份你就要测试会发生什么。
通过将NULL列转换成为NOT NULL列,你会想确保每个行都有一个值。但是这个表里肯定有一些列包含了NULL值。
在你创建备份时,含NULL值的一些列也同样进行了备份。你接下来要做的就是删除这个表,删掉现在所有的行,并且将列转换为NOT NULL。但是你现在不能还原备份,因为所有含有NULL值的行都被拒了。
这里就牵涉到如何解决这个问题。一个很显然的答案就是在创建备份之前将这些 NULL值转换成其他值。
UPDATE table SET column = 'shazam' WHERE column IS NULL |
注意你如果执行完了以上的任务,用一个真实值代替了该列中的每个NULL值,你就可以很安全地创建备份、删除表、将 NULL转换成NOT NULL、最后还原备份。
实际上,一旦你已经将所有的NULL值更新为实际值,你就可以尝试将该列从NULL转换为NOT NULL,不需要进行备份。数据库系统当然会检查整个表,但是既然没有了NULL值,那这些数据就会发生转换。
但是,它还会引起更深层次的问题:你是否能够真正拿出一个“magic value”进行转换。例如,我看见许多人将NULL值转为0个字节(字节长度为零),甚至用这个值定义该列的默认值:
CREATE TABLE ( ... column VARCHAR(37) NOT NULL DEFAULT '' |
在我看来,这实际上是一个设计错误。比下面的操作还要差:
CREATE TABLE ( ... , column VARCHAR(37) NOT NULL DEFAULT 'shazam' ... ) |
用空字符串代替NULL引起的自身的问题,我们在这里就不进行探讨了。有 "magic value"实际上也就是表示它并不是一个实际值,而是一个特殊值。但在我看来仍然是错误的。但是,如果你找到了能够将NULL值进行转换的实际值,那就转换吧!