Ошибки при попытке INSERT INTO таблицы с идентификатором столбца из промежуточной таблицы

Я пытаюсь вставить данные из промежуточной таблицы в другую аналогичную таблицу со столбцом идентификаторов и не могу исправить синтаксис SQL без ошибок. Это в PostgreSQL 14.

Промежуточная таблица:

      CREATE TABLE IF NOT EXISTS public.productstaging
(
    guid varchar(64) NOT NULL,
    productimagehash_sha2256 varchar(64) NOT NULL,
    productimage Bytea NOT NULL,
    UNIQUE (productimagehash_sha2256)
);

Таблица для вставки в:

      CREATE TABLE IF NOT EXISTS public.product
(
    id int NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    guid varchar(64) NOT NULL,
    productimagehash_sha2256 varchar(64) NOT NULL,
    productimage Bytea NOT NULL
);

Вставить запрос:

      -- Insert
INSERT INTO public.product
SELECT

public.productstaging.guid,
public.productstaging.productimagehash_sha2256,
public.productstaging.productimage

FROM public.productstaging
LEFT OUTER JOIN public.product
ON (

public.product.guid = public.productstaging.guid
AND public.product.productimagehash_sha2256 = public.productstaging.productimagehash_sha2256
)
WHERE public.product.guid IS NULL
AND public.product.productimagehash_sha2256 IS NULL;

Я получаю ошибку

ОШИБКА: столбец «id» имеет целочисленный тип, а выражение имеет переменный тип символа.

Я пробовал несколько вещей (перечисленных ниже) по запросу, но все они дают ошибки. Большая часть примеров при поиске вставки из списка фиксированных значений, а не вставки из другой таблицы, например ...VALUES(guid, productimagehash_sha2256, productimage).... Я не могу найти ничего похожего при поиске и надеялся, что кто-то может указать мне правильное направление?

      ...
DEFAULT, --ERROR:  DEFAULT is not allowed in this context
public.productstaging.guid,
public.productstaging.productimagehash_sha2256,
public.productstaging.productimage
...

...
0, --ERROR:  cannot insert a non-DEFAULT value into column "id"
public.productstaging.guid,
public.productstaging.productimagehash_sha2256,
public.productstaging.productimage
...

...
null, --ERROR:  cannot insert a non-DEFAULT value into column "id"
public.productstaging.guid,
public.productstaging.productimagehash_sha2256,
public.productstaging.productimage
...

1 ответ

Укажите целевые столбцы для INSERT — то, что вы должны делать всегда.

      INSERT INTO public.product (guid, productimagehash_sha2256, productimage )
SELECT productstaging.guid,
       productstaging.productimagehash_sha2256,
       productstaging.productimage
FROM public.productstaging
  LEFT JOIN ...

Видимо вы относитесь к сочетанию guid, productimagehash_sha2256как уникальный. Если вы создадите уникальный индекс для этих столбцов:

      create unique index on productstaging (guid, productimagehash_sha2256);

тогда ваш оператор INSERT становится намного проще:

      INSERT INTO public.product (guid, productimagehash_sha2256, productimage )
SELECT guid,
       productimagehash_sha2256,
       productimage
FROM public.productstaging
ON CONFLICT (guid, productimagehash_sha2256) 
   DO NOTHING;

Обратите внимание, что если guidхранит реальный UUID, этот столбец должен быть определен с типом uuidнет varchar

Другие вопросы по тегам