为何CREATE TABLE与ALTER TABLE的NOT NULL列语法规则不同?
为什么CREATE和ALTER添加NOT NULL列的规则不一样?
这个问题的核心其实是表在创建和修改时的状态天差地别,咱们掰开揉碎了说:
CREATE TABLE的无数据优势
当你执行CREATE TABLE Test ( ID int NOT NULL );时,这个表是刚诞生的“空架子”——连一行数据都没有。既然没有现有数据需要处理,数据库完全不用操心“给已有行填充ID值”的问题:未来你插入数据时必须手动提供ID的值,而当下没有任何行违反NOT NULL约束,所以哪怕没指定默认值,这条语句也能正常执行。ALTER TABLE的数据一致性要求
但执行ALTER TABLE Test ADD ID int NOT NULL;时情况就复杂了:
如果Test表已经有数据行,数据库需要给每一行的新ID列塞一个值,但你既没给默认值,又不允许存NULL,数据库总不能凭空生成一个合法的int值吧?哪怕当前表是空的,大多数数据库的ALTER逻辑也会默认按照“表可能已有数据”的场景来校验,毕竟ALTER语句的设计是要兼容各种表状态的,目的是保证整个表的数据始终符合约束规则,不会留下潜在的一致性隐患。
简单总结:CREATE是从无到有建空表,没有数据需要迁就;ALTER是给已有表(哪怕暂时空)加列,必须保证所有行都能满足新约束,所以要求更严格。
内容的提问来源于stack exchange,提问作者user3424480
相关产品推荐
相关产品推荐

