Azure Databricks创建临时表批量插入数据报错求助
解决临时表创建报错及批量导入UPC的问题
1. 先解决临时表语法报错
你用的CREATE TABLE #TEMP_ITEM (UPC_ID BIGINT NOT NULL)是SQL Server专属语法,但不同数据库对临时表的定义规则差异很大,这是触发PARSE_SYNTAX_ERROR的核心原因,对应不同数据库的修正语法如下:
- SQL Server/Azure SQL:语法本身没问题,报错大概率是权限不足(比如当前账号无临时表创建权限)或环境限制。可尝试改用全局临时表:
或者联系管理员开通临时表创建权限。CREATE TABLE ##TEMP_ITEM (UPC_ID BIGINT NOT NULL); - MySQL/MariaDB:必须添加
TEMPORARY关键字:CREATE TEMPORARY TABLE TEMP_ITEM (UPC_ID BIGINT NOT NULL); - BigQuery:不支持
#开头的临时表,需使用会话级临时表:CREATE TEMP TABLE TEMP_ITEM (UPC_ID BIGINT NOT NULL); - PostgreSQL:临时表语法为:
CREATE TEMP TABLE TEMP_ITEM (UPC_ID BIGINT NOT NULL);
2. 分批次从源表格导入UPC数据
搞定临时表创建后,分批次插入2万条数据可避免一次性插入的性能压力,以下是常用数据库的实现示例:
SQL Server 分批插入
CREATE TABLE #TEMP_ITEM (UPC_ID BIGINT NOT NULL); DECLARE @offset INT = 0; WHILE @offset < 20000 BEGIN INSERT INTO #TEMP_ITEM (UPC_ID) SELECT UPC_ID FROM source_upc_table -- 你的UPC源表名称 ORDER BY UPC_ID OFFSET @offset ROWS FETCH NEXT 1000 ROWS ONLY; -- 每次插入1000条 SET @offset = @offset + 1000; END
MySQL/MariaDB 分批插入
CREATE TEMPORARY TABLE TEMP_ITEM (UPC_ID BIGINT NOT NULL); SET @offset = 0; WHILE @offset < 20000 DO INSERT INTO TEMP_ITEM (UPC_ID) SELECT UPC_ID FROM source_upc_table ORDER BY UPC_ID LIMIT 1000 OFFSET @offset; SET @offset = @offset + 1000; END WHILE;
3. 不用临时表的替代方案
如果创建临时表始终受限,可直接用以下两种方式实现需求:
- 直接关联查询:若目标表与UPC源表在同一数据库,直接关联比临时表更高效:
SELECT t.* FROM your_target_table t JOIN source_upc_table s ON t.UPC_ID = s.UPC_ID; - 分批IN子句查询:将2万条UPC按每1000条一组拆分,用IN子句分批查询,避免IN列表过长导致报错:
-- 第一批次查询 SELECT * FROM your_target_table WHERE UPC_ID IN ( SELECT UPC_ID FROM source_upc_table ORDER BY UPC_ID LIMIT 1000 OFFSET 0 ); -- 第二批次将OFFSET改为1000,以此类推直至覆盖所有2万条数据
内容的提问来源于stack exchange,提问作者Debbie Piquelle
相关产品推荐
相关产品推荐

