【问题标题】:Automatically Initialize GETDATE() when inserting into MYSQL插入 MYSQL 时自动初始化 GETDATE()
【发布时间】:2014-01-29 23:59:11
【问题描述】:

~Similar question~w3schools perhaps helpful link

~问题:我正在向 mysql 数据库中插入行,我希望每一行都有一个列,其中显示当前日期(插入行的日期)。

~尝试的解决方案:

CREATE TABLE $this->DB.$table
              (
              id int,
              Report_Date date DEFAULT CURRENT_DATE ON UPDATE CURRENT_DATE)//this fails.

有人能解释一下 ON UPDATE 是什么意思吗?我很紧张,当我有多天的数据时,它会更新 Report_Date 的所有值并弄乱我的数据。我认为解决方案在 GETDATE 中的某个地方。此外,我不想要时间,只想要日期。非常感谢。

【问题讨论】:

    标签: mysql sql sqldatatypes


    【解决方案1】:
    1. CREATE TABLE Syntax 中所述(强调添加):

      DEFAULT 子句指定列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。 这意味着,例如,您不能将日期列的默认值设置为 NOW()CURRENT_DATE 等函数的值。 例外情况是您可以指定 CURRENT_TIMESTAMP作为 TIMESTAMP 或(从 MySQL 5.6.5 开始)DATETIME 列的默认值。见Section 11.3.5, “Automatic Initialization and Updating for TIMESTAMP and DATETIME

      因此你的选择是:

      • 使用TIMESTAMP 列(从MySQL v5.6.5 开始,您也可以使用DATETIME 列)并忽略时间部分;

      • INSERT 命令中明确指定当前日期:

        INSERT INTO myTable (id, Report_Date) VALUES (123, CURRENT_DATE)
        
      • 定义一个BEFORE INSERT trigger:

        CREATE TRIGGER myTrigger BEFORE INSERT ON myTable FOR EACH ROW
          SET NEW.Report_Date = IFNULL(NEW.Report_Date, CURRENT_DATE)
        
    2. 有人能解释一下 ON UPDATE 是什么意思吗?

      Automatic Initialization and Updating for TIMESTAMP and DATETIME 中所述:

      • 自动初始化的列被设置为插入行的当前时间戳,但没有为该列指定值。

      • 当行中任何其他列的值从其当前值更改时,自动更新的列会自动更新为当前时间戳。如果所有其他列都设置为其当前值,则自动更新的列保持不变。要防止自动更新的列在其他列更改时更新,请将其显式设置为其当前值。要在其他列未更改的情况下更新自动更新的列,请将其显式设置为应具有的值(例如,将其设置为 CURRENT_TIMESTAMP)。

    【讨论】:

    • 所以这很完美,在插入语句中明确提及 CURRENT_DATE 对我来说不是问题。但我的理解是,如果我正确地创建了表,我可以简单地 指定 CURRENT_DATE,并且当创建行时,它会自动神奇地将当前日期放在那里。我将如何创建表,这样我就不必在插入时提及 Report_Date 或 CURRENT_DATE?这个解决方案完全解决了我的问题,我只是想改进我的 sql-mojo。
    • @J-Dizzle:您可以定义触发器来设置列值 - 请参阅上面的更新。
    • 很好,我很欣赏众多解决方案。如果可以的话,我会 +2 答案! ——他们说你不应该在 cmets 中说“谢谢”,但人们怎么会知道我已经得到了我需要的答案?谢谢!
    • @J-Dizzle:绿色勾号表示,但非常感谢您的评论。 :)
    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 2017-07-21
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多