04.19.2011---SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
[1]
http://www.google.com.hk/search?hl=en&source=hp&q=INSERT+INTO+select+%E8%AF%AD%E5%8F%A5&aq=f&oq=&aqi=
http://www.google.com.hk/search?hl=en&safe=active&q=insert+select+%E8%AF%AD%E5%8F%A5+oracle&aq=f&aqi=&aql=&oq=
http://www.google.com.hk/search?q=pl/sql+dev+%E5%AF%BC%E5%87%BA+%E6%95%B0%E6%8D%AE++%E6%8C%89%E5%88%9B%E5%BB%BA%E6%97%B6%E9%97%B4&hl=en&safe=active&prmd=ivns&ei=9TqlTcL1GYP4vwPT3-GGCg&start=20&sa=N
[2]
http://www.itzhp.com/cn/shujuku/2010/1106/29627.html
关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用途
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:
1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中
2. 建立数据库间的 dblink,然后用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where ...
3. exp A 表,再 imp 到 B 表,exp 时可加查询条件
4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交
5. 再就是本篇要说到的 Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显
第 1 种方法在记录多时是个噩梦,需三五百条的分批提交,否则客户端会死掉,而且导入过程很慢。如果要不产生 REDO 来提高 insert into 的性能,就要下面那样做:
好啦,前面简述了 Oracle 中数据导入导出的各种方法,我想一定还有更高明的。下面重点讲讲 Oracle 的 Sql Loader (sqlldr) 的用法。
在命令行下执行 Oracle 的 sqlldr 命令,可以看到它的详细参数说明,要着重关注以下几个参数:
userid -- Oracle 的 username/password[@servicename]
control -- 控制文件,可能包含表的数据
-------------------------------------------------- --------------------------------------------------- --
log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log
bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad
data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
errors -- 允许的错误记录数,可以用他来控制一条记录都不能错
rows -- 多少条记录提交一次,默认为 64
skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述
还有更多的 sqlldr 的参数说明请参考:sql loader的用法。
用例子来演示 sqlldr 的使用,有两种使用方法:
1. 只使用一个控制文件,在这个控制文件中包含数据
2. 使用一个控制文件(作为模板) 和一个数据文件
一般为了利于模板和数据的分离,以及程序的不同分工会使用第二种方式,所以先来看这种用法。数据文件可以是 CSV 文件或者以其他分割符分隔的,数据文件可以用 PL/SQL Developer 或者 Toad 导出,也可以用 SQL *Plus 的 spool 格式化产出,或是 UTL_FILE 包生成。另外,用 Toad 还能直接生成包含数据的控制文件。
首先,假定有这么一个表 users,并插入五条记录:
第二种方式: 使用一个控制文件(作为模板) 和一个数据文件
1) 建立数据文件,我们这里用 PL/SQL Developer 导出表 users 的记录为 users_data.csv 文件,内容如下:
12. user_id number, --字段可以指定类型,否则认为是 CHARACTER 类型, log 文件中有显示
说明:在操作类型 truncate 位置可用以下中的一值:
1) insert --为缺省方式,在数据装载开始时要求表为空
2) append --在表中追加新记录
3) replace --删除旧记录(用 delete from table 语句),替换成新装载的记录
4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录
3) 执行命令:
sqlldr dbuser/dbpass@dbservice control=users.ctl
在 dbservice 指示的数据库的表 users 中记录就和数据文件中的一样了。
执行完 sqlldr 后希望能留意一下生成的几个文件,如 users.log 日志文件、users.bad 坏数据文件等。特别是要看看日志文件,从中可让你更好的理解 Sql Loader,里面有对控制文件的解析、列出每个字段的类型、加载记录的统计、出错原因等信息。
第一种方式,只使用一个控制文件在这个控制文件中包含数据
1) 把 users_data.cvs 中的内容补到 users.ctl 中,并以 BEGINDATA 连接,还要把 INFILE "users_data.csv" 改为 INFILE *。同时为了更大化的说明问题,把数据处理了一下。此时,完整的 users.ctl 文件内容是:
2) 执行一样的命令:
sqlldr dbuser/dbpass@dbservice control=users.ctl
比如,在控制台会显示这样的信息:
C:\>sqlldr dbuser/dbpass@dbservice control=users.ctl
达到提交点,逻辑记录计数4
达到提交点,逻辑记录计数5
上面的控制文件包含的内容比较复杂(演示目的),请根据注释理解每个参数的意义。还能由此发掘更多用法。
最后说下有关 SQL *Loader 的性能与并发操作
1) ROWS 的默认值为 64,你可以根据实际指定更合适的 ROWS 参数来指定每次提交记录数。(体验过在 PL/SQL Developer 中一次执行几条条以上的 insert 语句的情形吗?)
2)常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的性能。当然,在很多情况下,不能使用此参数(如果主键重复的话会使索引的状态变成UNUSABLE!)。
[3]
http://blog.myspace.cn/e/406702386.htm
关于select into和insert into select语句[问题点数:20分,结帖人:7761098
2010/03/17 15:29 [计算世界 ]
----------------------------------------
-- 7761098(湖光)--
----------------------------------------
这两个语句是sql中最常用的插入数据的方法,也是日常使用频率最高的语句,这里就根据自己的一些经验简单探讨一下
基本语法
insert into主要有两种方式
1. 直接数值插入,一般会列出表的结构然后紧跟要插入的数据,要插入的数据和表结构要严格对应(除了一些计算列之外)
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 timestamp,
column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4)
VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4)
VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2)
VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1
2. 子查询插入,通过查询语句从相关表中读取数据插入
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T2', 'U') IS NOT NULL
DROP TABLE dbo.T2;
GO
CREATE TABLE dbo.T2
(
column_1 int IDENTITY,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 timestamp,
column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T2
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO
select into主要通过查询语句从相关表中读取数据插入到新创建的表中(新创建的表只保留原始结构,但是没有计算函数,约束…)
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, e.Title, a.AddressLine1, a.City, sp.Name AS [State/Province], a.PostalCode
INTO dbo.EmployeeAddresses
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID
JOIN HumanResources.EmployeeAddress AS ea ON ea.EmployeeID = e.EmployeeID
JOIN Person.Address AS a on a.AddressID = ea.AddressID
JOIN Person.StateProvince as sp ON sp.StateProvinceID = a.StateProvinceID;
GO
这些只是msdn相关的介绍,应该都熟知的,就不多说了
特殊应用
1. select into 创建和原始列编码一致的表
很多时候数据库,表,和列都有不同的编码,尤其是在一些特殊应用下,
例如英文版的win 2003下装繁体中文版的sql server 2005然后附加简体中文创建的数据库文件,这些时候开发以及维护的时候就会遇到编码问题,结果不能正确显示甚至查询结果不是自己想要的(equal to在不同编码下不能正常工作),解决方法最好的当然是统一所有的编码了,但是如果不能做到的话
这时候一般的解决方法是在要操作数据库下用select into创建临时表,然后将操作数据都放在这个临时表里面,最后在更新到数据库原始表中
虽然步骤上面多了一步,但是可以保证完全可旧数据的编码一致,并且不用硬性转码,这里需要注意的是tempdb这个数据库的编码也不一定和操作数据库的编 码一致,所以临时表一定要创建在操作数据库上
2. select into 创建备份表或者储存查询结果
很多时候如果需要多次查询或者更新后要和原始表做比较的话,就可以很方便的利用select into创建一个备份表或者结果集来存储数据方便进一步的使用及操作
USE AdventureWorks;
GO
SELECT ×
INTO Person.Contact_bak
FROM Person.Contact GO
异同比较
相同点
两者都是数据插入,将操作数据插入到目标表
不同点
1 .性能
a.如果数据库采用完全日志(日志记录方式:bulk-logged recovery),两者性能并没有大的区别
b.如果简单日志的话,select into会快过insert into很多,测试数据显示select into是insert into大概10倍。由于select into并没有记录下操作日志在ldf文件,而只是简单记录分页日志,所以操作会快很多,但是相应的,这个时候如果试图通过log explorer等日志分析工具来恢复数据库,是行不通的。
2.select into 会创建表,如果目标表已经存在就会报错;insert into需要目标表已经存在,否则也会报错
3.在触发器或者存储过程中使用select into容易造成死循环
4.insert into 可以使用分区表,而select into不能使用,它所创建的表也在数据库默认文件夹下,尽管原始表可能是分区表并具有分区scheme,但是新创建表并不保留这些数据
5.select into不能设定表锁,所以会造成锁表
总结
涉及到编码问题以及测试用途时,可以使用select into以方便创建表,记录数据,保证编码一致。
而在正式开发时候,尽量使用insert into可以保证约束,并尽早发现潜在问题。
[4]
http://blogold.chinaunix.net/u2/86974/showart_2036845.html
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。
1.INSERT INTO SELECT语句
语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:
INSERT INTO SELECT语句复制表数据
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
create TABLE Table2
(
a varchar(10),
c varchar(10),
d int,
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
GO
select * from Table2
--3.INSERT INTO SELECT语句复制表数据
Insert into Table2(a, c, d) select a,c,5 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
2.SELECT INTO FROM语句
语句形式为:SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:
SELECT INTO FROM创建表并复制表数据
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
GO
--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
原帖地址:http://www.cnblogs.com/freshman0216/archive/2008/08/15/1268316.html
[5]
http://www.itpub.net/viewthread.php?tid=1007849
结论: 指定插入字段的时候,不能采用nologging方式,否则会报错;
如果数据量大,需要nologging方式,则只能指定Null或默认值.
[6]
http://www.bitscn.com/pdb/mssql/201010/191480.html
SQL中SELECT INTO和INSERT INTO SELECT语句介绍(1)
时间:2010-10-04 17:17 来源:互联网 字体:[大 中 小]
SQL SERVER数据库中,表复制是经常要用到的操作,下面就将为您介绍SQL中SELECT INTO和INSERT INTO SELECT语句,供您参考。
Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。
1.INSERT INTO SELECT语句
语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
create TABLE Table2
(
a varchar(10),
c varchar(10),
d int,
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
GO
select * from Table2
--3.INSERT INTO SELECT语句复制表数据
Insert into Table2(a, c, d) select a,c,5 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
2.SELECT INTO FROM语句
语句形式为:SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
GO
--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
[7]
http://blog.sina.com.cn/s/blog_5bbbcffe0100d474.html
[8]
http://blog.sina.com.cn/s/blog_5bbbcffe0100d474.html
PL/SQL Developer如何导出数据成sql的insert语句 (2009-04-08 13:03:03)转载 标签: sql pl 语句 文化
PL/SQL Developer如何导出数据成sql的insert语句
1.选择菜单 , 【工具】-【导出表】
2.选择tab标签页的,【SQL插入】
3.选择输入文件,导出即可
[9]
[10]

浙公网安备 33010602011771号