Sql-Server
有條件地使用計算列
是否可以將不可為空的列設置為 a) 使用 INSERT/UPDATE 查詢自由添加值 b) 如果插入時未提供值,以避免空條目添加預設值到另一列的值?
我知道使用計算列我可以將預設值設置為另一個列值,但是我不能覆蓋它。
一個例子:
CREATE TABLE test (id INT, val INT); GO
CREATE TRIGGER tr ON test AFTER INSERT, UPDATE AS UPDATE test SET val = 123 -- custom value which must be set instead of NULL -- maybe any expression -- and even an output of the subquery WHERE EXISTS ( SELECT NULL FROM INSERTED WHERE id = test.id AND val IS NULL ); GO
INSERT INTO test VALUES (1,1), (2,null), (3,3); SELECT * FROM test; GO
編號 | 值 -: | --: 1 | 1 2 | 123 -- NULL 被替換為自定義值 3 | 3
UPDATE test SET val = NULL where id = 1; SELECT * FROM test; GO
編號 | 值 -: | --: 1 | 123 -- NULL 被替換為自定義值 2 | 123 3 | 3
db<>在這裡擺弄
雖然觸發器可能會像 Akina 的回答一樣正常工作,但我和 Charlieface 一起使用預設約束,因為這正是它要解決的問題,而且解決方案稍微輕一些。它也作為表定義的一部分存在,而不是作為需要維護的伺服器上的單獨對象,因此如果您要為表編寫腳本,預設約束將自動使用它編寫腳本,而不是Trigger。
直接來自 Microsoft 的範例:
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT DEFAULT 50 );
以上將允許您自由
INSERT
,UPDATE
column_b
但如果您沒有指定進入表格column_b
時的值INSERT
,那麼它將預設為50
.這是與上面相同的範例,但為Default Constraint指定了一個名稱:
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50 );