使用单个 INSERT 语句将多行插入到表中
Posted
技术标签:
【中文标题】使用单个 INSERT 语句将多行插入到表中【英文标题】:Inserting multiple rows into a table using a single INSERT statement 【发布时间】:2012-05-24 20:15:38 【问题描述】:我不知道为什么我不能使用这种语法将值插入到我的表中。我可以插入一行,但我不能插入多行。
CREATE TABLE T1 (
ID BIGINT NULL,
CAT VARCHAR(255) NULL,
M_ID BIGINT NULL,
T_CAT VARCHAR(255) NULL,
NUM BIGINT NULL)
INSERT INTO T1
VALUES
(32,'Math',945,'Red',2),
(6,'English',232,'Blue',2)
【问题讨论】:
这是哪个 DBMS?在我的脑海中,您可能需要在表格名称后面的括号中列出您插入的列。 我将 SquirrelSQL 与 Netezza 一起使用 在SQL Server mysql 和Postgre 中运行良好,您遇到错误了吗? 是的,^ 发现“INSERT”(在字符 154 处)需要关键字 SQLState: HY000 ErrorCode: 1100 【参考方案1】:您的语法是正确的。但是,插入多行是 SQL-92 功能。好像你的数据库不支持。
【讨论】:
您确定此功能包含在 SQL92 规范中吗?我在 13.8 部分查看它,并且可以找到它。【参考方案2】:尝试明确定义要插入的列:
INSERT INTO T1 (ID, CAT, M_ID, T_CAT, NUM)
VALUES
(32,'Math',945,'Red',2),
(6,'English',232,'Blue',2)
见this working example
【讨论】:
由于值的数量与列的数量相匹配,它应该可以在不列出列的情况下工作,对吧? (即使这可能是不好的做法) 你认为我会解释“我可以插入一行,但我不能插入多行。”【参考方案3】:我认为并非所有数据库都支持使用 VALUES 语句插入多行。您可以使用单独的插入语句:
INSERT INTO T1 VALUES (32,'Math',945,'Red',2);
INSERT INTO T1 VALUES (6,'English',232,'Blue',2);
或者,您可以改用 SELECT 语法:
INSERT INTO T1
select 32,'Math',945,'Red',2 union all
select 6,'English',232,'Blue',2
(注意:我使用 SQL Server 语法来获取常量。您可能需要添加类似“from dual”之类的内容。)
最后,我完全同意其他发帖者的观点,即将列列表放在表名之后是一种很好的做法,您应该自动执行此操作。好吧,另一个好的做法是拥有一个自动递增的 id 列,如果您有其中之一,则需要列列表。
但是,没有列表应该不会导致您的问题。
【讨论】:
问题是我有 1000 行,我想使用 values 语句将所有行输入到我的表中。有没有办法从文本文件中导入这些行? 当然可以,但这高度依赖于数据库。我可能会建议别的东西。将表加载到 Excel 中并编写 Excel 公式以创建 INSERT 语句。然后批量复制所有这些插入语句并运行它们。只是一个想法,但对于一次性加载非常方便。 顺便说一句,您可以通过构造插入查询的“select ... union all”形式来做同样的事情。对于 1000 行,这将运行得更快。【参考方案4】:此特定错误是因为您没有使用分号终止 CREATE TABLE 语句。 Netezza 需要终止语句,它不能智能地解析多语句查询。
CREATE TABLE T1 (
ID BIGINT NULL,
CAT VARCHAR(255) NULL,
M_ID BIGINT NULL,
T_CAT VARCHAR(255) NULL,
NUM BIGINT NULL);
INSERT INTO T1
VALUES
(32,'Math',945,'Red',2),
(6,'English',232,'Blue',2);
您遇到的下一个错误也很可能是 Gordon 的响应,因为 NZ 并不真正支持任何高级 VALUES 子句选项。
【讨论】:
【参考方案5】:由于上述大多数答案都正确解释了 Netezza 不支持 VALUES 子句,因为它属于 NZ 不熟悉的 SQL-92 类,您也可以使用 Netezza 客户端附带的 nzload 工具来加载您的数据一口气。
将数据从 CSV 文件加载到 NZ 表中的命令是:
nzload -host <host> -u <username> -pw <password> -db <db_name> -t <table_name> -delim ',' -df <data_file>
【讨论】:
【参考方案6】:Netezza 支持在 SQL 中批量上传。非标准的 EXTERNAL TABLE 将常规表替换为 CSV 平面文件。这可以在 INSERT...SELECT... 语句中使用。
请注意,USING 子句没有逗号分隔术语(我对此有所了解)。另外,因为我使用 pyODBC,所以设置了 PIPE 分隔符和 ODBC。 JAVA 是另一个REMOTESOURCE。 skiprows 1 项会丢弃标题。
INSERT INTO NetezzaTable
SELECT *
FROM EXTERNAL 'C:\\temp\\Your.csv'
USING (
delimiter '|'
REMOTESOURCE 'ODBC'
LOGDIR 'C:\\temp'
skiprows 1
maxerrors 0
fillrecord);
【讨论】:
以上是关于使用单个 INSERT 语句将多行插入到表中的主要内容,如果未能解决你的问题,请参考以下文章