使用单个 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 分隔符和 ODBCJAVA 是另一个REMOTESOURCEskiprows 1 项会丢弃标题。

INSERT INTO NetezzaTable
SELECT *
FROM EXTERNAL 'C:\\temp\\Your.csv'
USING (
delimiter '|'
REMOTESOURCE 'ODBC'
LOGDIR 'C:\\temp'
skiprows 1
maxerrors 0
fillrecord);

【讨论】:

以上是关于使用单个 INSERT 语句将多行插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

mysq

SQL插入多行

5)-MySQL插入数据

如何用SQL语句向一个表中插入多行记录

怎样在sql中用insert语句往表中插入多行

如何用SQL语句向一个表中插入多行记录