我正在使用旧的SQL 2000数据库,而且我没有很多SQL经验。当一个新行被添加到我的一个表时,我需要根据工作类别的列分配一个默认时间值。
例如,工作类别A将分配1小时的时间值,类别B将分配2小时等...
如果用户没有手动输入他们完成工作所花费的时间,则只应设置该值。我想过使用默认约束来做这个,但是如果默认值具有依赖性,我认为这不会起作用。
最好的方法是什么?
答案 0 :(得分:9)
我会在Insert上使用触发器。
只需检查是否已分配值,如果没有,请抓住正确的值并使用它。
答案 1 :(得分:6)
使用Stephen Wrighton建议的触发器:
CREATE TRIGGER [myTable_TriggerName] ON dbo.myTable FOR INSERT
AS
SET NOCOUNT ON
UPDATE myTable
SET
timeValue = '2 hours' -- assuming string values
where ID in (
select ID
from INSERTED
where
timeValue = ''
AND workCategory = 'A'
)
答案 2 :(得分:2)
请务必编写触发器,以便处理多行插入。不要在触发器中一次处理一行,或者假设插入的表中只有一行。
答案 3 :(得分:2)
如果您要查找的是基于另一列定义列定义,您可以执行以下操作:
create table testable
(
c1 int,
c2 datetime default getdate(),
c3 as year(c2)
);
insert into testable (c1) select 1
select * from testable;
您的结果集应如下所示:
c1 | c2 | c3
1 | 2013-04-03 17:18:43.897 | 2013
正如你所看到的AS(在列定义中)可以解决问题;)希望它有所帮助。
答案 4 :(得分:1)
是的,触发。
当然,您不会对默认值进行硬编码,而是从表格中查找它们。
对此进行扩展,您的新表将成为work_category表(id,name,default_hours),并且原始表维护一个外键,转换为fom (id,work_category,hours)到(id,work_category_id,小时)。
答案 5 :(得分:1)
因此,例如,如果你想将一个标签统计为另一个标签,那么在TAG表中(标签应用于帖子)...但是默认将新标签计算为自己,你会得到这样的触发器: / p>
CREATE TRIGGER [dbo].[TR_Tag_Insert]
ON [dbo].[Tag]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.Tag
SET [CountAs] = I.[ID]
FROM INSERTED AS I
WHERE I.[CountAs] IS NULL
AND dbo.Tag.ID = I.ID
END
答案 6 :(得分:1)
我可以想到两种方式:
触发器似乎在这里得到了很好的解释,所以我不会详细说明。但一般来说,我会尝试远离这种东西的触发器,因为它们更适合其他任务
"默认值或绑定"可以通过创建一个函数来实现,例如
CREATE FUNCTION [dbo].[ComponentContractor_SortOrder] ()
RETURNS float
AS
BEGIN
RETURN (SELECT MAX(SortOrder) + 5 FROM [dbo].[tblTender_ComponentContractor])
END
然后设置"默认值或绑定"该列为([dbo] .ComponentContractor_SortOrder)
答案 7 :(得分:0)
通常我会避开触发器。几乎所有dbms都对constraints.
有某种支持我发现它们更容易理解,调试和维护。