向 Cloud Spanner 表添加 NOT NULL 约束

问题描述 投票:0回答:4

如果创建的 Cloud Spanner 表包含可为 null 的列,是否可以在列上添加 NOT NULL 约束而无需重新创建表?

google-cloud-platform google-cloud-spanner
4个回答
1
投票

在现有表上的 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;

1
投票

不幸的是,无法添加非空列

做法:

1 添加可为空的列

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

谢谢。


0
投票

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

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


0
投票

您可以使用以下查询创建非空列:

ALTER TABLE table1 ADD COLUMN column1 INT64 NOT NULL DEFAULT (0);
© www.soinside.com 2019 - 2024. All rights reserved.