【问题标题】:sql when set default value getdate(), does it set value when run update statement?sql当设置默认值getdate()时,它在运行更新语句时是否设置值?
【发布时间】:2021-12-14 16:17:34
【问题描述】:

我知道当你在数据库中插入一个值时,它会将该列值设置为当前日期时间, 当您运行更新语句时它是否适用于它?

例如

表架构:

Id, Name, CreatedDate(getdate())

当我插入表 id = 1 , name = 'john' 时,它会设置 createdDate = current date

如果我运行更新语句

update table set name="john2" where id =1

它会更新createdDate吗?

【问题讨论】:

  • 如果您要问是否有一种简单的方法可以在表中实现“LastModifiedDateTime”列,那么没有,没有简单的方法可以实现。
  • 没有简单的方法来实现“LastModifiedDateTime”?如果您有一个列,然后您对该列的更新包含值“sysdate”,那么这非常容易。我不认为它比任何其他更新更难。
  • @Tony318 挑战在于 OP 不想在每个更新语句中都提及该列。今天这需要一个触发器,因为默认约束无助于更新。
  • @Tony318 - 如果您不希望插入器/更新器必须引用该列和/或当时指定值。
  • @Kiddo 为什么要在稍后更新行时更新createdDate 列?这不应该是一个单独的列吗?

标签: sql tsql


【解决方案1】:

不,DEFAULT CONSTRAINT 仅在 INSERT 上调用,并且仅在 (a) 与 NOT NULL 约束结合或 (b) 使用 DEFAULT VALUES 时调用。对于 UPDATE,SQL Server 根本不会查看您的 DEFAULT CONSTRAINT。目前您需要一个触发器(请参阅How do I add a "last updated" column in a SQL Server 2008 R2 table?),但已经有多个请求要内置此功能。

我在博客中介绍了一种诱使 SQL Server 使用临时表执行此操作的方法:

但这充满了警告和限制,实际上只是在忽略其他多个类似的帖子:

【讨论】:

    【解决方案2】:

    哇 - 很难理解...

    根据线索,我认为没有。

    如果您在列中插入一条 NULL 记录,并且该列定义了默认值,则将存储默认值而不是 null。

    update 只会更新语句中指定的列。

    除非您有执行特殊逻辑的触发器 - 在这种情况下,您需要查看触发器代码才能知道答案。

    【讨论】:

    • 如果您插入一个带有显式NULL 的行,它将被设置为NULL 或被拒绝(如果该列不接受空值)。仅当 a) 该列未包含在 INSERT 的列列表中,或 b) 关键字 DEFAULT 位于 VALUES 子句中列的适当位置时,才会使用默认值。跨度>
    【解决方案3】:

    如果你的更新语句告诉用 getfate() 更新一个列,它会,但如果你只是更新一个名称,并且你有一个 createdate 列(它是用 getdate() 插入的),这些列不会受到影响。

    【讨论】:

      【解决方案4】:

      您可以使用 DEFAULT 约束来实现这一点,就像我在下面的语句中使用 OrderDate 字段一样。

      创建表订单 ( O_Id int 非空, OrderNo int NOT NULL, P_Id 整数, OrderDate 日期 DEFAULT GETDATE() )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 2014-05-06
        • 2013-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-17
        相关资源
        最近更新 更多