Hibernate, SQL Server: как я могу использовать значение по умолчанию в качестве значения из другого столбца
Например: у меня есть столбец COLUMN_PK типа int identity(1,1) и столбец COLUMN_NUM pf типа int, как я могу определить значение по умолчанию для COLUMN_NUM - значение COLUMN_PK?
Так что, если у меня есть сущность с не указанным COLUMN_NUM, он будет заполнен сгенерированным значением из COLUMN_PK. Но если указано COLUMN_NUM, будет использоваться его значение.
5 ответов
Создайте 3-й столбец, который вычисляется
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. Тем не менее, это решение выше работает для последующих обновлений тоже без дополнительного кода (т.е. еще один триггер для обновления)
Я бы навязал это через триггер.
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
Используйте вычисляемый столбец и скалярную функцию в качестве значения по умолчанию.
Использование NHibernate для вызова хранимой процедуры для вставки данных, а не прямая вставка через метод.save, может дать вам больше контроля.
Как насчет того, чтобы иметь дочернюю таблицу для хранения только 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