使用单个INSERT语句将多行插入表中

时间:2012-05-24 20:15:38

标签: sql netezza squirrel-sql

我不知道为什么我不能使用这种语法将值插入到我的表中。我可以插入一行,但我不能插入多行。

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)

6 个答案:

答案 0 :(得分:4)

您的语法是正确的。但是,插入多行是SQL-92的一项功能。好像您的数据库不支持它。

答案 1 :(得分:1)

尝试明确定义要插入的列:

INSERT INTO T1 (ID, CAT, M_ID, T_CAT, NUM)
VALUES
(32,'Math',945,'Red',2),
(6,'English',232,'Blue',2)

请参阅this working example

答案 2 :(得分:1)

我不认为所有数据库都支持使用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列,如果你有其中一个,你需要列列表。

但是,没有列表不应该导致您的问题。

答案 3 :(得分:1)

此特定错误是因为您没有使用分号终止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子句选项。

答案 4 :(得分:0)

由于上述大多数答案都正确地解释了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>

答案 5 :(得分:0)

Netezza支持在SQL中批量上传。非标准EXTERNAL TABLE用CSV平面文件替换常规表。这可以在INSERT ... SELECT ...语句中使用。

请注意 USING 子句没有逗号分隔术语(我得到了一点点)。此外,设置了PIPE分隔符和 ODBC ,因为我使用pyODBC。 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);