簡體   English   中英

SQL:如何將數據插入到具有列名的表中

[英]SQL: How to insert data into a table with column names

將數據插入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)

謝謝

您必須指定列名稱。 但是,有一個例外。 如果您按照與表中相同的順序插入與目標表完全相同的列數,請使用以下語法:

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

不,沒有辦法專門做你想要的。 您可以做的最接近的事情是使用列創建順序以避免在insert命令上使用列名稱。 這樣:

如果你有一張桌子

tableA ( id, name, phone )

您可以使用在其上插入值

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

但要小心,你必須按照表格字段的確切順序,否則你可能會出錯,最糟糕的是,將錯誤的數據放在錯誤的字段中。

不,你不能這樣做,唯一的另一種選擇是從select中插入

插入MyTable選擇'val1'作為col1,'val4'作為col4,'val8'作為col8 - 如果任何額外的列然后只做“null as col10”

假設表中的順序相同

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

我找到了解決這個問題的方法,但它相當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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM