如何基于另一列为SQL中的一列设置默认值

如何基于另一列为SQL中的一列设置默认值,sql,Sql,我使用的是一个旧的SQL 2000数据库,我没有太多的SQL经验。当一个新行被添加到我的一个表中时,我需要根据工作类别的列指定一个默认时间值 例如,工作类别A的时间值为1小时,类别B的时间值为2小时,等等 仅当用户未手动输入完成工作所用的时间时,才应设置该值。我曾考虑过使用默认约束来实现这一点,但我认为如果默认值具有依赖性,那么这将不起作用 最好的方法是什么?我会在插入时使用触发器 只需检查是否已指定值,如果未指定,则获取正确的值并使用它 是的,扳机 当然,您可以从表中查找默认值,而不是硬编码默

我使用的是一个旧的SQL 2000数据库,我没有太多的SQL经验。当一个新行被添加到我的一个表中时,我需要根据工作类别的列指定一个默认时间值

例如,工作类别A的时间值为1小时,类别B的时间值为2小时,等等

仅当用户未手动输入完成工作所用的时间时,才应设置该值。我曾考虑过使用默认约束来实现这一点,但我认为如果默认值具有依赖性,那么这将不起作用


最好的方法是什么?

我会在插入时使用触发器

只需检查是否已指定值,如果未指定,则获取正确的值并使用它

是的,扳机

当然,您可以从表中查找默认值,而不是硬编码默认值

在此基础上展开,新表将成为work_category表(id、名称、默认小时数),原始表将保留一个外键,用于转换fom
(id,工作类别,小时数)到(id,工作类别,小时数)。

通常我会避开触发器。几乎所有的数据库管理系统都支持


我发现它们更容易理解、调试和维护。

一定要编写触发器,以便它能够处理多行插入。不要在触发器中一次处理一行,或者假设插入的表中只有一行。

因此,例如,在标记表(标记应用于POST)中,如果要将一个标记计数为另一个标记…但默认情况下,将新标记计数为其本身,则会有如下触发器:

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
create table testable 
(
    c1 int, 
    c2 datetime default getdate(), 
    c3 as year(c2)
);

insert into testable (c1) select 1

select * from testable;

按照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'
)

如果您希望基于另一列定义列定义,则可以执行以下操作:

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
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

正如您所看到的那样(在列定义中)实现了这个技巧;)希望有帮助。

我可以想出两种方法:

  • 触发
  • 默认值或绑定(应与依赖项一起使用)
  • 触发器在这里似乎解释得很好,所以我不想详细说明。但一般来说,我会尽量远离这类东西的触发器,因为它们更适合其他任务

    “默认值或绑定”可以通过创建函数来实现,例如

    CREATE FUNCTION [dbo].[ComponentContractor_SortOrder] ()
    RETURNS float
    AS
    BEGIN
    RETURN (SELECT MAX(SortOrder) + 5 FROM [dbo].[tblTender_ComponentContractor])
    END
    

    然后将该列的“默认值或绑定”设置为([dbo].ComponentContractor\u SortOrder)

    如果我理解请求,您只想在插入时更改此值,请使用约束。如果要在任意位置将其更改为行,请使用触发器。似乎只会引发错误,而没有设置默认值。“AS”在PostgreSQL中似乎无效。问题是针对SQL Server 2000,它没有提到任何有关PostgreSQL的内容。对不起,对我来说工作很有魅力。谢谢您知道创建这样的触发器是否会以任何方式影响数据库插入速度吗?这取决于触发器中的逻辑和/或查询。不过,我预计不会对用户造成明显影响。不过,如果您没有使用SQL 2000(如OP中所示),我会考虑在默认属性中使用用户定义的scaler函数,而不是触发器