使用UNNEST批量插入PostgreSQL表时为何报指定列数不匹配错误
问题原因及解决方法
错误原因
你执行的UNNEST查询中,SELECT * FROM UNNEST(...)返回的是单个数组类型的列(每个元素是包含13个值的一维数组),但INSERT语句指定了13个目标列,两者数量不匹配,因此触发INSERT has more target columns than expressions错误。
而VALUES写法是直接传入13个独立的值,和目标列数量完全对应,所以能正常执行。表的自增主键id无需指定,这个不是问题所在。
正确的UNNEST批量插入写法
需要将UNNEST返回的数组元素拆分为13个独立列,对应INSERT的目标列:
INSERT INTO studio (imageId, job, imageName, imagePath, imageWidth, created_at, lastModified, imageYear, imageServiceType, imageClient, imageCategory, imageCountry, imageThumbnail) SELECT arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8], arr[9], arr[10], arr[11], arr[12], arr[13] FROM UNNEST(ARRAY[ ['01GNYB5KJTYRQ4WY5PKNE3C6RRBTZH3RFK', 'GC092', 'GC092 - Alcon Qual Cataract Screener', '/SHELFA1_HR.jpg', '5120', '2023-4-5', '2023-03-27T15:49:37Z', '2023', 'Pack LAB', 'ALCON', 'OTHER', 'Brazil, France, Germany, Japan, Spain, USA', 'thumbnail'], ['01GNYB5KMGENM2ETF6UREZBET4B42KS3MQ', 'GC130', 'GC130 - Alcon Shelf Navigation Conjoint', '/SHELF1_AUS.jpg', '5120', '2023-4-5', '2023-03-27T15:16:06Z', '2023', 'Other', 'ALCON', 'HEALTH & BEAUTY - OTHER', 'Brazil, USA, Australia', 'thumbnail'] ]) AS t(arr);
说明
- 通过
arr[N]提取数组中的第N个元素,精准对应INSERT的第N个目标列; - 给UNNEST的结果起别名
t(arr),方便引用数组元素; - 这种写法既保持了批量插入的简洁性,又保证了列数完全匹配。
内容的提问来源于stack exchange,提问作者TabulaRasa
相关产品推荐
相关产品推荐

