SQL:如何将数据插入到具有列名的表中

时间:2013-12-16 21:59:31

标签: sql sql-server

将数据插入SQL Server表时,是否可以指定要将数据插入哪个列?

对于带

的表格

我知道你可以有这样的语法:

INSERT INTO MyTable (Name, col4_on, col8_on, col9_on)
VALUES ('myName', 0, 1, 0)

但是当你有很多列时,上面的语法变得难以处理,特别是如果它们有二进制数据。很难匹配哪个1和0与哪个列相匹配。我希望有一个像语法一样的命名参数(类似于C#),如下所示:

INSERT INTO MyTable 
VALUES (Name: 'myName', col4_on: 0, col8_on: 1, col9_on: 0)

由于

5 个答案:

答案 0 :(得分:4)

您必须指定列名称。但是,有一个例外。如果您完全 与目标表的列数相同的列数与表中的相同,请使用以下语法:

INSERT INTO MyTable
VALUES ('val1A', 'val4A', 'val8A')

请注意,这是执行INSERT的一种脆弱方式,因为如果该表发生更改,或者在不同系统上对列的排序方式不同,INSERT可能会失败,或者更糟 - 它可能会在每列中放入错误的数据。

我发现当我INSERT很多列时,如果我能以某种方式对它们进行分组,我会发现查询更容易阅读。如果列名很长,我可以将它们放在单独的行上,如下所示:

INSERT INTO MyTable
(
    MyTable_VeryLongName_Col1,
    MyTable_VeryLongName_Col4,
    MyTable_VeryLongName_Col8,
    -- etc.
)
SELECT
    Very_Long_Value_1,
    Very_Long_Value_4,
    Very_Long_Value_8,
    -- etc.

或者你可以在一行上对2列进行分组,或者每隔5行放置一个空格,或者每隔10行进行一次注释等。无论什么使它更容易阅读。

如果在插入大量行时发现包含列名称繁琐,请尝试将数据链接在一起:

INSERT INTO MyTable (col1, col4, col8)
VALUES ('val1A', 'val4A', 'val8A'),
    ('val1B', 'val4B', 'val8B'),
    -- etc.

UNION他们在一起:

INSERT INTO MyTable (col1, col4, col8)
SELECT 'val1A', 'val4A', 'val8A'
UNION ALL 'val1B', 'val4B', 'val8B'
UNION ALL ... -- etc.

或者,从另一个表中选择它们:

INSERT INTO MyTable (col1, col4, col8)
SELECT val1, va4, val8
FROM MyOtherTable
WHERE -- some condition is met

答案 1 :(得分:1)

不,没有办法专门做你想要的。您可以做的最接近的事情是使用列创建顺序以避免在insert命令上使用列名称。就这样:

如果您有像

这样的表格
tableA ( id, name, phone )

您可以使用

在其上插入值
insert into tableA values ( 1, 'Name', '555-9999' );

但要小心,你必须遵循表格字段的确切顺序,否则你可能会出错,最糟糕的是,将错误的数据放在错误的字段中。

答案 2 :(得分:0)

不,你不能这样做,唯一的另一种选择是从select

插入

插入MyTable 选择'val1'作为col1,'val4'作为col4,'val8'作为col8 - 如果任何额外的列然后只做“null as col10”

假设表中的顺序相同

答案 3 :(得分:0)

INSERT INTO MyTable (col1, col4, col8)
VALUES ('val1', 'val4', 'val8')

此语句会将值添加到INSERT INTO语句中提到的列中,您可以使用以下格式编写上述查询,它不会有任何区别。

INSERT INTO MyTable (col8, col1, col4)
VALUES ('val8', 'val1', 'val4')

OR

INSERT INTO MyTable (col4, col8, col1)
VALUES ('val4', 'val8', 'val1')

一次添加多行,你可以在you values子句中一次传递多行,如下所示

INSERT INTO MyTable (col4, col8, col1)
VALUES ('val4', 'val8', 'val1'),
       ('val4', 'val8', 'val1'),
       ('val4', 'val8', 'val1'),
       ('val4', 'val8', 'val1')
  

值的顺序应与列的顺序匹配   在INSERT INTO声明中提到。

以上所有陈述都会有相同的结果。

一旦提到了一个列就必须记住一件事,你必须为它提供一个值

像这样

INSERT INTO MyTable (col1, col4, col8)
VALUES ('val1', null, 'val8')

但是你不能做这样的事情

INSERT INTO MyTable (col1, col4, col8)
VALUES ('val1', 'val8')

答案 4 :(得分:0)

我找到了解决这个问题的方法,但它相当hacky,只适用于包含具有唯一值的列的表:

INSERT INTO MyTable (Name)
VALUES ('myName')
UPDATE MyTable
SET col4_on=0, col8_on=1, col9_on=0
WHERE Name = 'myName'

这可以扩展为多行插入,如下所示:

INSERT INTO MyTable (Name)
VALUES ('row1'), ('row2'), ('row3')
UPDATE MyTable SET col4_on=0, col8_on=1, col9_on=0 WHERE Name = 'row1'
UPDATE MyTable SET col4_on=1, col8_on=0, col9_on=0 WHERE Name = 'row2'
UPDATE MyTable SET col4_on=1, col8_on=1, col9_on=1 WHERE Name = 'row3'