例如:我有COLUMN_PK類型的int identity(1,1)列和COLUMN_NUM pf類型的int類型,我如何定義COLUMN_NUM的默認值 - COLUMN_PK的值?Hibernate,SQL Server:我如何使用默認值作爲另一列的值
因此,如果我有沒有指定COLUMN_NUM的實體,它將填充從COLUMN_PK生成的值。但是如果指定了COLUMN_NUM,它的值將被使用。
例如:我有COLUMN_PK類型的int identity(1,1)列和COLUMN_NUM pf類型的int類型,我如何定義COLUMN_NUM的默認值 - COLUMN_PK的值?Hibernate,SQL Server:我如何使用默認值作爲另一列的值
因此,如果我有沒有指定COLUMN_NUM的實體,它將填充從COLUMN_PK生成的值。但是如果指定了COLUMN_NUM,它的值將被使用。
使用計算列和標量函數作爲默認值。
創建計算
CREATE TABLE MyTable (
COLUMN_PK int NOT NULL identity(1,1) ,
...
COLUMN_NUM_internal int NULL,
COLUMN_NUM AS COALESCE (COLUMN_NUM_internal, COLUMN_PK),
...
)
的PK值是未知的,直到INSERT(當然)一個第三塔。但之前沒有,所以你有這樣的事情,或者使用觸發器來更新COLUMN_NUM。但是,上面的這個解決方案也適用於隨後的更新,也沒有額外的代碼(即更新的另一個觸發器)
這種解決方案是不可接受的 – Taras 2011-02-14 20:58:46
我會通過觸發器強制執行此操作。
create trigger tr_IU_YourTable on YourTable
for insert,update
as
begin
update yt
set column_num = yt.column_pk
from inserted i
inner join YourTable yt
on i.column_pk = yt.column_pk
and yt.column_num is null
end
go
如何讓子表只存儲COLUMN_PK和COLUMN_NUM?只有在指定了COLUMN_NUM值的情況下,該表纔會有記錄。然後,你可以這樣做:
CREATE TABLE Parent (COLUMN_PK int NOT NULL identity(1,1), someCol int NOT NULL)
CREATE TABLE Child (COLUMN_PK int NOT NULL, COLUMN_NUM int NOT NULL)
INSERT INTO Parent (someCol) VALUES (1)
INSERT INTO Parent (someCol) VALUES (2)
INSERT INTO Parent (someCol) VALUES (3)
INSERT INTO Parent (someCol) VALUES (4)
INSERT INTO Parent (someCol) VALUES (5)
INSERT INTO Child VALUES (1, 10)
INSERT INTO Child VALUES (3, 30)
INSERT INTO Child VALUES (5, 50)
SELECT COLUMN_PK,
CASE WHEN EXISTS (SELECT NULL FROM Child WHERE Child.COLUMN_PK = Parent.COLUMN_PK)
THEN (SELECT COLUMN_NUM FROM Child WHERE Child.COLUMN_PK = Parent.COLUMN_PK)
ELSE COLUMN_PK
END
FROM Parent
使用NHibernate調用存儲過程來插入數據,而不是使用直接插入通過.save方法可以給你更多的控制。
標量函數直到插入後纔會有PK的值,所以udf在我的情況下無法幫助填充COLUMN_NUM – gbn 2011-02-14 20:58:43