【问题标题】:Adding NOT NULL constraint to Cloud Spanner table向 Cloud Spanner 表添加 NOT NULL 约束
【发布时间】:2017-07-06 04:06:31
【问题描述】:

如果使用可为空的列创建 Cloud Spanner 表,是否可以在不重新创建表的情况下对列添加 NOT NULL 约束?

【问题讨论】:

    标签: google-cloud-platform google-cloud-spanner


    【解决方案1】:

    您可以将 NOT NULL 约束添加到非键列。您必须首先确保所有行都确实具有列的值。在完全应用 NOT NULL 约束之前,Spanner 将扫描数据以进行验证。有关如何更改表的更多信息是 herehere

    但是,您不能将这样的约束添加到键列。这种更改需要重写表中的所有数据,因为键的空值会影响数据的编码方式。进行该更改的唯一选择是创建一个按照您想要的方式设置的新表,进行代码更改以支持临时使用两个表,逐渐将数据从旧表移动到新表,并最终将代码更改为仅使用新表并删除旧表。如果您进一步想要原始表名,则必须再次执行整个操作。

    【讨论】:

    • 谢谢。添加了缺失的链接。
    【解决方案2】:

    不幸的是,没有办法添加非空列

    方法:

    1 添加可空列

    ALTER TABLE table1 ADD COLUMN column1 STRING(255)
    
    1. 更新 table1.column1,为列设置非空值(如果表不为空)。
    UPDATE TABLE table1 SET column1 = "<GENERATED DATA>"
    
    1. 添加约束
    ALTER TABLE table1 ADD COLUMN column1 STRING(255) NOT NULL
    

    谢谢。

    【讨论】:

      【解决方案3】:

      在现有表的 spanner 中创建可为空的列通常需要三个步骤...

      # add new column to table
      ALTER TABLE <table_name> ADD COLUMN <column_name> <value_type>;
      
      # create default values
      UPDATE <table_name> SET <column_name>=<default_value> WHERE TRUE;
      
      # add constraint
      ALTER TABLE <table_name> ALTER COLUMN <column_name> <value_type> NOT NULL;
      

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 2023-02-03
        • 2014-11-15
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 2015-04-22
        • 2017-02-16
        相关资源
        最近更新 更多