架構更改表重建
回答
在標準化CREATE-COPY-DROP-RENAME(CCDR)策略時,您可能會更好,並且只在少數情況下嘗試進行原地更改,其中DDL不需要重建,而不是嘗試編譯窮舉名單。這是此處描述的策略:link。
AFAIK,你只允許將列添加到現有的表(沒有重建)如果該列是:
- 添加到表AND
- 的端部可爲空的或具有默認約束
在其他情況下,MSSQL會可能失敗,如果它不知道在新添加的列或數據行的值用什麼損失是一個結果(例如截斷)。即使是在中間加入的違約列也會強制重建。
使事情進一步複雜化,在某些情況下,部署的成功取決於表中的數據類型,而不僅僅是涉及的模式。例如,將列長度更改爲更大的值(varchar(50) --> varchar(100)
)可能會成功;然而,減少長度只有有時允許。遷移數據類型變化是另一個棘手的問題。
總之,我會總是重建和很少改變到位。
-
爲了說明行數據影響結果:
create table dbo.Yak(s varchar(100));
insert into dbo.Yak
values(replicate('a', 100));
go
-- attempt to alter datatype to 50 (FAIL: String or binary data would be truncated.)
alter table dbo.Yak
alter column s varchar(50);
go
-- shorten the data in row to avoid data loss
delete from dbo.Yak;
insert into dbo.Yak
values(replicate('a', 50));
go
-- again, attempt to alter datatype to 50 (SUCCESS)
alter table dbo.Yak
alter column s varchar(50);
go
select len(s),* from dbo.Yak;
go
--cleanup
drop table dbo.Yak;
go
這是一個很棒的閱讀。做得好。 – Darthg8r
在Management Studio中,選擇要更改的表並右鍵單擊設計。更改表格設計窗口中列的數據類型(用int測試錢)。
不是保存,而是在窗口中右鍵單擊並選擇「生成更改腳本」。複製對話框中的SQL語句。
*)在以前的版本(SQL2000)中,任何更改都會重新創建整個表格(據我所知)。看來,重命名和添加列已針對ALTER TABLE語句進行了優化。
是的,這是如何找出來的;但是,問題是如何去做 – zanlok
我通過使用Visual Studio數據庫項目來管理這樣的事情變得非常溺愛。一旦我的模式被導入到項目中,我可以進行任何我想要的更改,並且VSDP將確定是否可以在不刪除對象(例如使用ALTER)的情況下完成更改,或者是否需要創建新的對象和複製值從舊的(它自動執行)。
計劃一個小小的工作來了解如何將其融入到您的特定環境和工作流程中,但我發現這項工作非常值得。
- 1. 實體框架和更改表格架構/結構
- 2. 在sql 2005中更改表架構
- 3. 更改架構名稱
- 4. 防止Hibernate架構更改
- 5. JDBC更改默認架構
- 6. 更改結構表
- 7. 構建用戶更新儀表板活動的架構ala facebook
- 8. 重構XSD架構
- 9. 重命名應用程序不會更改架構
- 10. MySQL表更改表結構
- 11. 在更改IosGraphics.java後更新和重新構建libGDX
- 12. MsBuild:在更改構建配置時強制重建
- 13. 使用Microsoft同步框架2.1更新架構更改
- 14. 更改Eclipse構建命令
- 15. TFS構建架構
- 16. 重複架構
- 17. Django sqlite - 如何更改架構
- 18. JPA - EclipseLink - 如何更改默認架構
- 19. React Redux網址更改事件/架構
- 20. 在Cassandra中架構更改已超時
- 21. 無痛數據庫架構更改
- 22. 更改語法中的關聯架構
- 23. 更改貓鼬架構視圖模型
- 24. 在運行時更改WebSphere dataSource架構
- 25. 跟蹤MySQL架構和程序更改
- 26. 如何更改Microsoft架構版本
- 27. Oracle:根據角色更改架構
- 28. 如何更改腳手架名稱而不重新創建?
- 29. 加載架構json文件以創建表或作業架構
- 30. 如何更改SQL Server Compact Edition表架構中的列順序?
你是什麼意思「重建?」丟棄並重新創建? –
是的,丟棄,重新創建和重新插入數據。 – Darthg8r