使用一条INSERT语句完成多表插入

多表插入高级SQL技巧
这是一条颠覆常规的插入方法,一条INSERT语句可以完成向多张表的插入任务。小小地展示一下这种插入方法。

1.创建表T并初始化测试数据,此表作为数据源。
sec@ora10g> create table t (x number(10), y varchar2(10));
sec@ora10g> insert into t values (1,'a');
sec@ora10g> insert into t values (2,'b');
sec@ora10g> insert into t values (3,'c');
sec@ora10g> insert into t values (4,'d');
sec@ora10g> insert into t values (5,'e');
sec@ora10g> insert into t values (6,'f');
sec@ora10g> commit;

2.查看表T的数据
sec@ora10g> select * from t;

         X Y
---------- ----------
         1 a
         2 b
         3 c
         4 d
         5 e
         6 f

6 rows selected.

3.创建表T1和T2,作为我们要插入的目标表。
sec@ora10g> create table t1 as select * from t where 0=1;

Table created.

sec@ora10g> create table t2 as select * from t where 0=1;

Table created.

4.第一种多表插入方法INSERT ALL
1)完成INSERT ALL插入
sec@ora10g> insert all into t1 into t2 select * from t;

12 rows created.

这里之所以显示插入了12条数据,实际上表示在T1表中插入了6条,T2表插入了6条,一共是12条数据。

2)验证T1表中被插入的数据。
sec@ora10g> select * from t1;

         X Y
---------- ----------
         1 a
         2 b
         3 c
         4 d
         5 e
         6 f

6 rows selected.

3)验证T2表中被插入的数据。
sec@ora10g> select * from t2;

         X Y
---------- ----------
         1 a
         2 b
         3 c
         4 d
         5 e
         6 f

6 rows selected.

OK,完成INSERT ALL命令的使命。

5.第二种多表插入方法INSERT FIRST
1)清空表T1和T2
sec@ora10g> delete from t1;
sec@ora10g> delete from t2;
sec@ora10g> commit;

2)完成INSERT FIRST插入
sec@ora10g> insert first when x>=5 then into t1 when x>=2 then into t2 select * from t;

5 rows created.

处理逻辑是这样的,首先检索T表查找X列值大于等于5的数据(这里是“5,e”和“6,f”)插入到T1表,然后将前一个查询中出现的数据排除后再查找T表,找到X列值大于等于2的数据再插入到T2表(这里是“2,b”、“3,c”和“4,d”)。注意INSERT FIRST的真正目的是将同样的数据只插入一次。
3)验证T1表中被插入的数据。
sec@ora10g> select * from t1;

         X Y
---------- ----------
         5 e
         6 f

4)验证T2表中被插入的数据。
sec@ora10g> select * from t2;

         X Y
---------- ----------
         2 b
         3 c
         4 d

5)为真实的反映“数据只插入一次”的目的,我们把条件颠倒后再插入一次。
sec@ora10g> delete from t1;
sec@ora10g> delete from t2;

sec@ora10g> insert first when x>=2 then into t1 when x>=5 then into t2 select * from t;

5 rows created.

sec@ora10g> select * from t1;

         X Y
---------- ----------
         2 b
         3 c
         4 d
         5 e
         6 f

sec@ora10g> select * from t2;

no rows selected

OK,目的达到,可见满足第二个条件的数据已经包含在第一个条件里,所以不会有数据插入到第二张表。

同样的插入条件,我们把“INSERT FIRST”换成“INSERT ALL”,对比一下结果。
sec@ora10g> delete from t1;

5 rows deleted.

sec@ora10g> delete from t2;

0 rows deleted.

sec@ora10g> insert all when x>=2 then into t1 when x>=5 then into t2 select * from t;

7 rows created.

sec@ora10g> select * from t1;

         X Y
---------- ----------
         2 b
         3 c
         4 d
         5 e
         6 f

sec@ora10g> select * from t2;

         X Y
---------- ----------
         5 e
         6 f

是不是在豁然开朗的基础上又有一种锦上添花的感觉。That's it.

6.Oralce官方文档参考链接
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9014.htm#SQLRF01604

7.小结
这些小小小的高级SQL技巧在实际的应用中有很大用处。慢慢体会吧。

Good luck.

secooler
10.01.06

-- The End --
<think> 我们正在讨论的是Amazon Redshift是否支持一条INSERT语句插入条记录。根据提供的引用和一般知识,我可以回答这个问题。 引用[2]提到:“通常情况下,对于几千条甚至几十万条记录的数据迁移而言,采取DML(即数据操纵语言)的INSERT语句能够很好地将数据迁移到目标数据库中。” 但同时也指出当数据量过于庞大时,使用INSERT语句会生成事务日志而减慢加载速度,因此建议使用批量加载操作。 那么,Redshift是否支持一条INSERT语句插入条记录呢?答案是肯定的。Redshift支持使用INSERT语句一次插入行数据,语法类似于标准的SQL。例如: ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1a, value2a, ...), (value1b, value2b, ...), ...; ``` 但是,需要注意的是,虽然Redshift支持这种语法,但在插入大量数据时,使用单条INSERT语句插入行并不是最高效的方式。因为每条INSERT语句都会产生事务开销,并且单条语句插入大量行可能会导致执行时间较长,甚至可能达到语句长度的限制。 根据引用[2]的建议,对于大量数据的迁移,应该使用批量加载操作,例如: - 使用COPY命令从Amazon S3加载数据(这是Redshift中最快的数据加载方式) - 使用INSERT INTO ... SELECT ... 语句从其他中选择数据插入 - 使用批量插入工具或框架 另外,引用[3]提到Redshift是一个大规模并行数据仓库,支持JDBC/ODBC接口,因此也可以通过编程方式使用批量插入(比如使用JDBC的批量处理功能)来提高效率。 总结: 1. Redshift支持一条INSERT语句插入条记录,使用行VALUES子句。 2. 对于小批量数据(例如几千条),这种方式是可行的。 3. 对于大批量数据(几十万条以上),建议使用COPY命令或批量插入技术,以提高效率并减少事务日志的开销。 因此,用户可以根据数据量的大小选择合适的方式。 根据要求,生成相关问题: 1. 在Redshift中,使用一条INSERT语句插入条记录的最大行数限制是少? 2. Redshift的COPY命令如何从S3加载数据? 3. 如何使用JDBC在Redshift中实现批量插入? </think> 基于提供的引用信息,我将回答关于Redshift的INSERT语句支持情况: ### Amazon Redshift是否支持一条INSERT语句插入条记录? **是的,Redshift支持通过单条INSERT语句插入条记录**,语法与标准SQL兼容: ```sql INSERT INTO table_name (column1, column2) VALUES ('value1a', 'value2a'), ('value1b', 'value2b'), ('value1c', 'value2c'); ``` 但需要注意三个关键优化点: 1. **性能限制** 虽然语法支持,但直接使用INSERT在大数据量场景(>几十万行)效率较低,因为每条INSERT都会生成事务日志[^2]。此时应优先使用批量加载方案。 2. **推荐替代方案** 对于海量数据同步,应采用: - `COPY`命令从S3加载(最高效方式) - 使用JDBC批量插入接口 ```python # JDBC批量插入示例 conn = redshift_connect() cursor = conn.cursor() cursor.executemany("INSERT INTO table VALUES (%s,%s)", batch_data) # 批量执行 ``` 这些方式可减少事务日志开销[^2][^3]。 3. **网络连接验证** 若遇到执行失败(如引用[1]中的认证错误),需检查: - VPC子网配置(确保private subnet能通过NAT网关或S3端点访问外部资源) - JDBC连接串的正确性(URL/用户名/密码) - 安全组规则(开放Redshift端口) ### 操作建议 1. **小批量数据**(< 1万行) 直接使用行VALUES语法: ```sql INSERT INTO "public"."test_kinesis_sync" (pk, sk, value) VALUES ('id1', 'sku1', 100), ('id2', 'sku2', 200); ``` 2. **大批量数据**(> 1万行) 采用S3 + COPY命令: ```sql COPY "public"."test_kinesis_sync" FROM 's3://bucket/data.manifest' IAM_ROLE 'arn:aws:iam::*:role/RedshiftRole' MANIFEST; ``` 此方法可避免事务日志瓶颈,速度提升10倍以上[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值