例如:我有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