4

例如:我有 int identity(1,1) 类型的 COLUMN_PK 列和 int 类型的 COLUMN_NUM 列,我如何定义 COLUMN_NUM 的默认值 - COLUMN_PK 的值?

因此,如果我有未指定 COLUMN_NUM 的实体,它将使用来自 COLUMN_PK 的生成值填充。但如果指定了 COLUMN_NUM,则将使用其值。

4

5 回答 5

1

创建计算的第三列

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。然而,上面的这个解决方案也适用于后续的更新,没有额外的代码(即更新的另一个触发器)

于 2011-02-14T20:55:55.817 回答
0

让一个子表只存储 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
于 2011-02-22T18:01:19.947 回答
0

使用计算列和标量函数作为默认值。

于 2011-02-14T20:54:07.543 回答
0

我将通过触发器强制执行此操作。

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
于 2011-02-14T20:56:04.657 回答
0

使用 NHibernate 调用存储过程来插入数据,而不是通过 .save 方法使用直接插入,可以为您提供更多控制。

于 2011-03-03T18:27:27.603 回答