SQL語法提示工具SQL Prompt——添加NOT NULL列或使可空列NOT NULL的問題 下

SQL Prompt是一款實用的SQL語法提示工具。SQL Prompt根據數據庫的對象名稱、語法和代碼片段自動進行檢索,爲用戶提供合適的代碼選擇。自動腳本設置使代碼簡單易讀--當開發者不大熟悉腳本時尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據需要進行自定義,使之以預想的方式工作。

本教程解釋了在向現有表添加非可空列或將包含空值的列更改爲非可空時可能遇到的問題。他演示了一個可以安全部署此類更改的遷移腳本。本文是教程的後半部分內容,內容緊接前文(點擊這裏查看)~

清單5:在創建列NOT NULL之前使用默認值更新現有行

所以,效果很好。

推出所有變更

現在是時候將所有這些更改推廣到只有設計版本1、沒有Location表格、CountingWords沒有TheLanguage列和可空Word列的人員。

推出新Location表,因爲它是該表的第一個版本,不是真正的問題(參見清單3)。但是,將更改推廣到新CountingWords表需要添加一個TheLangauge不允許NULLs的Word列,並且NOT NULL在兩種情況下都要更改列,以避免我們已經討論過的問題。

我們還希望我們的遷移腳本能夠正常工作,無論我們是否正在更新現有的v1 CountingWords,或者我們需要從頭開始構建表的v2。此外,如果腳本意外重新運行,我們不希望腳本造成任何傷害或觸發錯誤。

另外,在任何一種情況下,我們還需要將該TheLangauge列設置CountingWords爲FOREIGN KEY自動更新以響應父鍵的更新或刪除,以及更改PRIMARY KEY。作爲最後一步,我們將添加11-20的舊威爾士語單詞,這是我們以前不知道的。

以下是遷移腳本,它將CountingWords從v1 遷移到v2,或者從頭開始創建v2,如果意外重新運行,這將不會造成任何損害。在嘗試之前,要麼刪除CountingWords表,要麼重新運行清單1以重新建立表的v1。

2019-08-27_174413.png

清單6:CountingWords v2的安全遷移腳本

如果不是爲了確保遷移腳本在所有情況下都能正常工作,那就簡單多了。我只是討厭只能在特定情況下運行的構建腳本。

現在讓我們通過在不同的語言或區域中添加一到二十的計數單詞來測試它:

DECLARE @Language NVARCHAR(30) = 'West Cumbrian';
IF NOT EXISTS 
  (SELECT * FROM dbo.Location 
  WHERE TheLanguage LIKE @Language
  ) INSERT INTO dbo.Location (TheLanguage) 
      VALUES (@Language);
/* and now we can add in any other ways of counting up to 
twenty that we want */
IF NOT EXISTS (SELECT * FROM CountingWords WHERE Thelanguage LIKE @Language)
INSERT INTO CountingWords (TheValue, Word, TheLanguage)
  SELECT TheValue, word, @Language
    FROM
      (
      VALUES ('yan', 1), ('tyan', 2), ('tethera', 3), ('methera', 4),
        ('pimp', 5), ('sethera', 6), ('lethera', 7), ('hovera', 8),
        ('dovera', 9), ('dick', 10), ('yan-a-dick', 11), ('tyan-a-dick', 12),
        ('tethera-dick', 13), ('nethera-dick', 14), ('bumfit', 15),
        ('yan-a-bumfit', 16), ('tyan-a-bumfi t', 17), ('tithera-bumfit', 18),
        ('methera-bumfit', 19), ('giggot', 20)
      ) AS f (word, TheValue);
GO

清單7:Yan,Tyan,Tethera——在西坎布里亞郡數到20

現在我改變了主意。它不應該被稱爲“老威爾士”,而是“古老的威爾士”。真可惜,但我們現在可以測試我們的外鍵約束。

UPDATE dbo.Location SET TheLanguage = 'Archaic Welsh' WHERE TheLanguage LIKE 'Old Welsh' 
SELECT * FROM location
SELECT * FROM CountingWords

清單8:更改語言後的級聯更新

就像變魔法一樣,所有引用都已更改。現在我有一個可以使用的數據庫!

21word-image-1.png

我提供了一個FillCountingWordsTable  腳本,其中包含47個記錄位置和語言的完整計數單詞集,可用於更廣泛的測試。向美國的朋友和親戚道歉,我遺漏了幾個使用相同計數押韻的印第安部落。事實證明,他們被英國殖民者編織了,他們認爲用於計算縫線的詞語是魔法的一部分。

22word-image-2.png

結論

我們剛剛建立了一個相當精細的演示,說明如何避免更改已填充數據的表的一些問題。在此示例中,問題涉及NULL值的使用,當您嘗試添加無法接受NULL值的新列時,或者NOT NULL當列中存在現有NULL值時,將現有的可空列更改爲列時,會發生這些問題。在第一種情況下,您只需DEFAULT首先向列添加約束,使用值不是NULL,在第二種情況下,NULL首先通過更新表來刪除值。

這些是對現有表進行更改的技術,這就是爲什麼我詳細闡述了演示如何將這兩個操作作爲彈性腳本的一部分進行操作的原因,無論是新建還是遷移,都可以運行,這可以重新運行而不會產生任何不利影響。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章