【问题标题】:MYSQL: How can I create a MySQL table so, that a field's default value is the output of a functionMYSQL:如何创建 MySQL 表,以便字段的默认值是函数的输出
【发布时间】:2010-11-11 15:42:08
【问题描述】:

问题 我怎样才能创建一个 MySQL 表,以便字段的默认值是函数的输出。

可以不用插入触发器来完成吗?

背景:需要每天观察一些实体及其所属的群体。

为此,我创建了以下 MySQL 表:

CREATE TABLE entity (
    entity_id  VARCHAR(10) NOT NULL,
    group_id   VARCHAR(10) NOT NULL,
    first_seen DATE        NOT NULL,
    last_seen  DATE        NOT NULL,
    PRIMARY KEY (entity_id,group_id)
)

脚本每天解析实体日志并写入 entity_raw,然后我想使用更新表

REPLACE INTO entity (entity_id,group_id,last_seen) 
SELECT entity_id,group_id,record_date 
  FROM entity_raw 
 WHERE (record_date = DATE(DATE_SUB(NOW(),INTERVAL 1 DAY))

插入新的 (entity_id,group_id) 对时自然会出错,因为 first_seen 可能不为 NULL...

这可以在一个语句中完成,而不是使用触发器(我不喜欢它们,对于维护来说太令人惊讶了)

还是我需要先选择存在,然后相应地插入/更新?

【问题讨论】:

    标签: sql mysql replace ddl


    【解决方案1】:

    经过一番搜索,我想出了这个..它解决了我的“问题”,但不是我问的问题:-(

    REPLACE INTO entity (entity_id,group_id,first_seen,last_seen) 
    SELECT r.entity_id              AS entity_id
         , r.group_id               AS group_id
         , ISNULL( e.first_seen
                  ,r.record_date
                 )                  AS first_seen
         , r.record_date            AS last_seen
      FROM entity_raw r
      LEFT OUTER JOIN entity e ON (    r.entity_id=e.entity_id 
                                   AND r.group_id=e.group_id
                                  )
     WHERE (record_date = DATE(DATE_SUB(NOW(),INTERVAL 1 DAY))
    

    初始插入需要在禁用 where 子句的情况下完成(entity_raw 表中已经有 5 周的数据)

    【讨论】:

      【解决方案2】:

      您可以使用 TIMESTAMP 数据类型,它允许默认值 CURRENT_TIMESTAMP,但这会将其设置为 NOW() 而不是一天前。

      所以,我宁愿使用INSERT... ON DUPLICATE KEY UPDATE 声明:

      INSERT INTO entity (entity_id,group_id,first_seen,last_seen) 
      SELECT entity_id,group_id,record_date, record_date 
          FROM entity_raw 
          WHERE (record_date = DATE(DATE_SUB(NOW(),INTERVAL 1 DAY))
      ON DUPLICATE KEY UPDATE last_seen = VALUES(last_seen)
      

      具有唯一索引 en entity_id 和/或 group_id。当找到现有行时,这将仅覆盖 last_seen

      【讨论】:

      • 嗯..你回答了我的问题并试图解决我的问题..看看我自己的答案..
      • 是的,但也许您使用的是不支持此功能的旧 mysql 版本等(如果是,请相应地编辑您的问题)。因此,您可以投票选出一个可能有用的答案,但您应该先尝试,然后如果可行,请接受它作为您选择的工作答案对您的问题。
      【解决方案3】:

      不,如果没有触发器,您的要求是不可能的。 MySQL 中唯一可以从函数中为字段分配默认值的示例是 TIMESTAMP 类型,它可以将 CURRENT_TIMESTAMP 作为默认值。

      【讨论】:

      • +1 回答我的问题.. 幸运的是,还有另一种方法可以解决根本问题
      【解决方案4】:

      说实话,将更新或插入合并到一个语句中几乎是不可能的。

      如果您使用的是脚本,我会按照您的建议进行操作。首先检查是否存在,然后相应地更新或插入。

      否则触发器或存储过程将完成这项工作。

      【讨论】:

      • +1 回答我的问题.. 幸运的是,还有另一种方法可以解决根本问题
      猜你喜欢
      • 1970-01-01
      • 2014-08-24
      • 2011-08-14
      • 2021-06-10
      • 2012-02-13
      • 2020-10-11
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多