一次性在表中添加硬编码数据

Posted

技术标签:

【中文标题】一次性在表中添加硬编码数据【英文标题】:Adding hard code data in table in one go 【发布时间】:2016-11-11 06:04:31 【问题描述】:

我遇到了必须将硬编码数据添加到表中的情况。条目数以千计,有没有办法一次性通过查询添加呢?数据格式如下:

“1777193992”、“1777535342”、“1777519577”、“1777725624”、“1777311315”、 '1771416476'、'1779312636'、'1777125359'

我试过这个:

SELECT '1777193992', '1777535342', '1777519577', '1777725624', '1777311315', '1771416476', '1779312636', '1777125359' FROM dual;

但它给了我一行数据。我希望将数据插入列中。

【问题讨论】:

数以千计的值从何而来?如果您有它们的文件,则可以选择外部表或 SQL*Loader。如果没有,还有其他方法,但您必须稍微操作一下值列表。 (还有什么是目标列数据类型?你所有的例子都是数字,但你把它们当作字符串?) 【参考方案1】:

使用一堆 INSERT 命令创建一个脚本,每个值一个 INSERT。 然后将此脚本加载到您最喜欢的编辑器中,并一次性运行它。 在这种情况下,我最喜欢的方法是使用电子表格生成 SQL 命令。使用电子表格,我可以在几分钟内为数十万个值生成脚本。 一个简单的例子(使用谷歌表格):

值在 A 列中 在 B1 单元格中输入以下公式:="INSERT INTO tablename( columnname ) VALUES( '"&A1&"' );" 将此公式从 B1 单元格复制到 B 列中的其余单元格 选择 B 列并将其内容复制到文本编辑器中并在末尾附加 COMMIT; - 这是我们的 SQL 脚本,可以“一次性”运行 - 只需将其加载到 SQL Developer 中并按 F5

INSERT INTO tablename( columnname ) VALUES( '1777193992' );
INSERT INTO tablename( columnname ) VALUES( '1777535342' );
INSERT INTO tablename( columnname ) VALUES( '1777519577' );
INSERT INTO tablename( columnname ) VALUES( '1777725624' );
INSERT INTO tablename( columnname ) VALUES( '1777311315' );
INSERT INTO tablename( columnname ) VALUES( '1771416476' );
INSERT INTO tablename( columnname ) VALUES( '1779312636' );
INSERT INTO tablename( columnname ) VALUES( '1777125359' );
COMMIT;

【讨论】:

【参考方案2】:

如果您不想生成和运行大量单独的插入语句,有几种方法可以将数据组合为单个插入,例如从对偶中选择每个单独的值并将它们联合在一起:

insert into tablename(columnname)
select '1777193992' from dual
union all select '1777535342' from dual
union all select '1777519577' from dual
union all select '1777725624' from dual
union all select '1777311315' from dual
union all select '1771416476' from dual
union all select '1779312636' from dual
union all select '1777125359' from dual
/

或the insert all syntax 稍微滥用多表插入思想:

insert all
  into tablename(columnname) values ('1777193992')
  into tablename(columnname) values ('1777535342')
  into tablename(columnname) values ('1777519577')
  into tablename(columnname) values ('1777725624')
  into tablename(columnname) values ('1777311315')
  into tablename(columnname) values ('1771416476')
  into tablename(columnname) values ('1779312636')
  into tablename(columnname) values ('1777125359')
select * from dual
/

您可以通过修改 @krokodilko 显示的内容从 Excel 中生成这些内容。

您还可以创建一个用各个值填充的集合;这里使用built-in odcivarchar2list collection type:

insert into tablename(columnname)
select column_value
from table(sys.odcivarchar2list('1777193992', '1777535342', '1777519577',
  '1777725624', '1777311315', '1771416476', '1779312636', '1777125359'))
/

...虽然您可能对more than 1000 entries listed like that 有疑问,但您可以通过从 PL/SQL 填充集合来解决这个问题 - 这使得这种方法在这种情况下不那么吸引人。

但如果您有一个值列表,那么您可能会发现通过 external table 或 SQL*Loader 甚至通过 SQL Developer 的导入机制加载它们要容易得多。

如果您在自己的应用程序中有该列表,您也许可以从数组中填充一个集合,然后使用上面的 table() 版本,但具体如何取决于您使用的语言和驱动程序。

【讨论】:

以上是关于一次性在表中添加硬编码数据的主要内容,如果未能解决你的问题,请参考以下文章

带有选择和硬编码值的 SQL 插入

在 oracle 中列出的硬编码项目

对ASP.NET MVC的角色(外部数据库)进行硬编码并添加Windows Authenticated Users

MediaCodec 硬编码

html 将类添加到硬编码导航

从硬编码数组而不是 DB 创建游标