PostgreSQL — Как вставить данные в массив составного типа, который имеет только 1 атрибут?

#postgresql

#postgresql

Вопрос:

Отказ от ответственности: приведенные ниже примеры не имеют смысла.

Этот код работает:

 CREATE TYPE item AS (
    name    text,
    price   int
);

CREATE TYPE items_pack AS (
    items   item[],
    count   int
);

CREATE TABLE player (
    items_packs     items_pack[],
    name            text
);

INSERT INTO player VALUES (
    ARRAY[
        (ARRAY[
            ('sword', 100)::item, 
            ('hammer', 200)::item
        ], 2)::items_pack, 
        (ARRAY[
            ('knife', 300)::item, 
            ('gun', 400)::item
        ], 2)::items_pack
    ],
    'anyname'
);
 

Но это не работает (атрибут count был удален из типа items_pack):

 CREATE TYPE item AS (
    name    text,
    price   int
);

CREATE TYPE items_pack AS (
    items   item[]
    -- count is removed
);

CREATE TABLE player (
    items_packs     items_pack[],
    name            text
);

INSERT INTO player VALUES (
    ARRAY[
        (ARRAY[
            ('sword', 100)::item, 
            ('hammer', 200)::item
        ])::items_pack, 
        (ARRAY[
            ('knife', 300)::item, 
            ('gun', 400)::item
        ])::items_pack
    ],
    'anyname'
);
 

ОШИБКА: не удается привести тип item[] к items_pack

Похоже, синтаксис непоследователен? Или я что-то упускаю?

Комментарии:

1. Попробуйте ... row(array[...])::items_pack ...

2. @Abelisto Большое спасибо. Это сработало.

3. Вы должны явно указать row ключевое слово, если в нем есть только один элемент: конструкторы строк . Удачи.