【问题标题】:SQL: How to insert data into a table with column namesSQL:如何将数据插入到具有列名的表中
【发布时间】:2013-12-16 21:59:30
【问题描述】:

向 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)

谢谢

【问题讨论】:

  • 我认为第一个是唯一的方法。在场景 1 和场景 2 中必须输入列名有什么区别?在我看来,同样的工作量。此外,您甚至不需要列名。
  • 如果你有这么多列,这可能是一个问题,它可能是一个数据库设计问题。只需将列名保存在 txt 中,复制粘贴即可。
  • @PaulG 在文件柜中标记文件夹与将所有标签按与文件夹相同的顺序粘贴到柜子顶部有什么区别?相同的工作量。此外,您甚至不需要标签。 (抱歉,忍不住了。)

标签: sql sql-server


【解决方案1】:

我想出了一种解决方法,但它相当笨拙,仅适用于具有唯一值的列的表:

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'

【讨论】:

    【解决方案2】:

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

    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 和哪个 0 与哪个列在代码审查
    • 我明白了。我们的代码中有类似的问题。我使用我们用来使此类广泛查询更具可读性的一些策略编辑了我的帖子。
    【解决方案3】:
    INSERT INTO MyTable (col1, col4, col8)
    VALUES ('val1', 'val4', 'val8')
    

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

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

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

    要一次添加多行,您可以在值子句中一次传递多行,如下所示

    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】:

      不,没有办法专门做你想做的事。您可以做的最接近的事情是使用列创建顺序来避免在插入命令中使用列名。像这样:

      如果你有这样的桌子

      tableA ( id, name, phone )
      

      你可以在上面插入值

      insert into tableA values ( 1, 'Name', '555-9999' );
      

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

      【讨论】:

        【解决方案5】:

        不,您不能这样做,您唯一的其他选择是从选择中插入

        插入 MyTable select 'val1' as col1, 'val4' as col4, 'val8' as col8 -- 如果有任何额外的列,那么只需执行“null as col10”

        假设表中的顺序相同

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-08
          • 2018-08-14
          • 2017-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多