這個查詢如何交換tab1的col1和col2的數據? 基本上交換我們需要臨時變量,但在這裏我們不是。那麼sql server如何做到這一點?update tab1 set col1 = col2,col2 = col1
1
A
回答
4
只是:
UPDATE tabl
SET col1 = col2,
col2 = col1
沒有DML
查詢看到它的結果,以避免Halloween problem。
在內部,UPDATE
鎖被放置在記錄(或數據頁)上,舊的值被讀取並存儲到臨時變量,那麼鎖升級爲EXCLUSIVE
和新值(存儲在臨時變量)是寫入適當的專欄。
0
我的筆記信用喬·塞科:
在<set clause list>
每個任務並行執行和 每組第一次更改所有符合條件的行。或者至少是 這是理論模型。在實踐中,實現將首先使用WHERE 子句在一次傳遞中標記表中的所有限定行。如果沒有問題,那麼SQL引擎會在工作存儲中爲每個標記行創建一個 的副本。每個SET子句在舊行圖像上基於 執行,結果放入新行圖像。 最後,刪除舊行並插入新行。如果在所有這些過程中發生了一個 錯誤,則系統執行ROLLBACK,表 保持不變並報告錯誤。這種並行性不是 ,就像你在傳統的第三代編程 語言中找到的一樣,所以它可能很難學習。此功能可讓你寫一個 語句,將在兩列交換價值,即:
UPDATE MyTable
SET a = b, b = a;
這是不一樣的東西
BEGIN ATOMIC
UPDATE MyTable
SET a = b;
UPDATE MyTable
SET b = a;
END;
在第一次更新,列A和B交換每行中的值。在 第二對UPDATE中,列a將在每一行中獲得列b的所有值 。在該對的第二個UPDATE中,a(現在爲 與b的原始值具有相同的值)將被寫回 列b - 完全不變。對於值表達式可以有什麼限制。同一列在<set clause list>
中不能出現超過一次 - 這是合理的,因爲該語句的並行性 。既然兩者都同時生效,你就不知道使用哪個SET子句。
相關問題
- 1. SQL服務器:UPDATE SET MyTable的COL1 =值,COL2 = COL1
- 2. OrderByDesc COL1 COL2通過
- 3. WHERE col1和ORDER BY col2在(col1,col2)上使用複合鍵嗎?
- 4. MYSQL:GET DISCTINCT $ col1處最高$ COL2
- 5. 從col1中減去col2
- 6. SELECT * FROM table WHERE col1 <= col2?
- 7. Propel ORM - SELECT ... WHERE col1 = col2
- 8. 選擇的不同(COL1,COL2),其中COL1是字符串,COL2爲int
- 9. 對col1 = col2 * col3的約束進行語法檢查檢查col1 = col2 * col3
- 10. SQL選擇不同的COL1,其中COL2是_且COL2從不_ _?
- 11. 動態列col1 col2 col3 col3 col4
- 12. SELECT Col1,Col2,Col3 FROM Table WHERE Column1 has duplicates
- 13. bartlett.test通過公式col1〜col2 + col3失敗
- 14. Rails使用col2更新屬性表col1
- 15. 「使用實體框架排序Col1,Col2」
- 16. 如何在Derby中模擬UPDATE x SET(col1,col2)=(SELECT a,b FROM y)?
- 17. psycopg2:(COL1,COL2)的my_list:ProgrammingError:語法錯誤或接近 「陣列」
- 18. 減去兩列(Col1中-col2的),並添加剩餘下一行Col1中
- 19. QueryDSL如何寫「哪裏?col1和col2之間」
- 20. SELECT * FROM表VS選擇COL1,COL2,COL3從表
- 21. CASE在其中具有Col1中<> col2的
- 22. MySQL的選擇行只有數()作爲COL1 <> COL2
- 23. 的Sql計數行兩列,其中的col1一樣COL2
- 24. 名稱爲SELECT * FROM(VALUES(X,Y))AS TableLiteral(Col1中,col2的)
- 25. 通過Col1或Col2搜索時返回Col3
- 26. SQL選擇其中col1或col2等於變量的行
- 27. 無法獲得與COL1的獨特記錄和COL2排序
- 28. 爲什麼SQL標準不允許COUNT(col1,col2,...,colN)
- 29. 什麼是Django的ORM等價於SELECT col1 FROM table WHERE col2 = somestring?
- 30. SELECT * FROM TBL WHERE COL1 = $ VAR1和COL2 = $ VAR2和COL3 = $ VAR3
整齊!我從來不知道你可以指望這... – 2010-10-27 10:08:00
只是出於興趣,你知道這是否工作,即使隔離級別設置爲未讀提交? – 2010-10-27 10:27:28
@保羅:是的。儘管有'READ UNCOMMITED',DML查詢仍然會放置鎖。 – Quassnoi 2010-10-27 10:40:27