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
Другие вопросы по тегам