2012-08-09 31 views
7

看着心愛的W3schools,發現這page,實際上學到了一些有趣的東西。我不知道你可以在不指定列值的情況下調用插入命令。例如;SQL INSERT沒有指定列。怎麼了?

INSERT INTO table_name 
VALUES (value1, value2, value3,...) 

從我朦朧的記憶拉,我似乎記得SQL教授提的是,你有,如果他們是不以任何特定的順序處理領域(儘管在RDB的一面,但它不能保證) 。

我的問題是,服務器如何知道哪些值被分配到哪些字段?*我會自己測試這個,但是不打算使用生產服務器來執行哪一個是我現在可以訪問的。

如果這項技術具體,我正在研究PostgresSQL。這個特別的語法如何有用?

回答

6

你的教授是對的 - 你應該在命名這些值之前明確命名這些列。

在這種情況下,儘管按照它們出現在表格定義中的順序插入值。

這樣做的問題是,如果該順序發生更改,或者列被刪除或添加(即使它們可以爲空),則插入將會中斷。

就其用處而言,在生產代碼中沒有那麼多。如果您手動編寫快速插入代碼,那麼它可能會幫助您節省您輸入的所有列名稱。

3

它們按照它們在表格定義中的順序插入到字段中。所以如果你的表有字段(a,b,c),a = value1,b = value2,c = value3。

你的教授說得對,這是懶惰的,容易打破。但對於快速而髒的懶惰插入很有用。

0

這些值只是按列出現在表中的順序添加。當你不知道你正在使用的列的名字,但知道需要進入哪些數據時,這很有用。通常這不是一個好主意,但是如果列的順序當然會中斷中間插入更改或新列。

0

只有當您提供與列數相同數量的值時,該語法才能在未指定列的情況下工作。第二個更重要的是sql表中的列總是以相同的順序並且取決於你的表定義。在sql表中沒有固有順序的唯一東西是行。

0

當創建表時,每列將在系統表中有一個訂單號。所以,每個值將插入按順序..

Firt值會去第一列...的等等

SQL Server中,系統表SYSCOLUMN維持這個順序。 Postgresql應該有類似的東西..

2

我無法抗拒把「RTFM」放在這裏。
PostgreSQL的手工細節發生了什麼in the chapter on INSERT

目標列名可以任意順序列出。如果根本沒有列出 列名,默認爲 表的所有列以其聲明的順序排列;或第一個N列名,如果有 只有N列由VALUES子句提供或查詢。由VALUES子句或查詢提供的值 與顯式或隱式列表列表從左到右相關聯。

大膽重視我的。