Причина, по которой это не работает, заключается в том, что логика skip
возможна только для однострочных обновлений, как задокументировано в API :
Используется методами update
(для одного объекта) ...
Синтаксис многострочного обновления не допускает какой-либо логики пропуска, поэтому при отсутствии свойства необходимо указать значение по умолчанию, например:
{name: 'yob', skip, def: defaultValue}
defaultValue
может быть чем угодно, включая undefined
.
Кроме того, вы можете использовать свойство init
и динамически возвращать значение.
Так что в коде выше, если вы измените объявление столбца на это:
{name: 'yob', skip, def: null}
Ваш update
вызов сгенерирует:
UPDATE "players" AS t SET "firstname"=v."firstname","surname"=v."surname","yob"=v."yob","defensive_skill"=v."defensive_skill","offensive_skill"=v."offensive_skill","login"=v."login","password"=v."password" FROM (VALUES(25,'Stephen','Harrison',1991,5,3,'harry','123456'),(26,'Chr
is','Jackson',null,5,4,'chris','123456')) AS v("id","firstname","surname","yob","defensive_skill","offensive_skill","login","password")
Как видно из сгенерированного SQL, невозможно пропустить один столбец с таким синтаксисом, поэтому skip
игнорируется для многострочных обновлений. Однако вы можете увидеть, что это работает, если вы передаете по одному объекту за раз, но это другой сценарий использования, чем тот, который вы ищете.