Я выполнил команду ниже, чтобы создать новую таблицу из существующей таблицы. Проблема в том, что BQ создает эту новую таблицу, но меняет режим столбцов REQUIRED на NULLABLE.
create table `project_id.dataset.new_table_name` as
select * replace(
array(select as struct person.* except(add) from t.person) as person
)
from `project_id.dataset.table_name` t;
Ожидается, что режим столбца не изменится.
Атрибут NOT NULL таблицы column_schema не распространяется через запросы к таблице. Если таблица T содержит столбец, объявленный как x INT64 NOT NULL, например, CREATE TABLE dataset.newtable AS SELECT x FROM T создает таблицу с именем dataset.newtable, в которой x имеет значение NULL.
Итак, вам лучше рассмотреть явное определение схемы.
CREATE OR REPLACE TABLE `project_id.dataset.table_name` (
Id STRING,
Person ARRAY<STRUCT<
Name STRING NOT NULL,
Add STRUCT<line STRING>
>>
) AS
SELECT 'id', [('John', STRUCT('aaa'))];
CREATE OR REPLACE TABLE `project_id.dataset.new_table_name` (
Id STRING,
Person ARRAY<STRUCT<
Name STRING NOT NULL
>>
) AS
SELECT * REPLACE (ARRAY(SELECT AS STRUCT Person.* EXCEPT(add) FROM t.Person) AS Person)
FROM `project_id.dataset.table_name` t;