2009-07-17 52 views
1

问题如何创建MySQL表,以便字段的默认值是函数的输出。MYSQL:如何创建一个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 ...

这可以在一个语句中完成,格格(我不喜欢他们,太令人惊讶的维护)

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

回答

0

一番搜索后,我来到了这个..它解决了我的“问题”,但不是问题,我问:-(

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周的数据)

1

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

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

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

+0

+1用于回答我的问题..幸运的是有另一种方法来解决潜在的问题 – lexu 2009-07-17 10:00:57

2

不,没有触发器,你问的是不可能的。 MySQL中唯一可以从函数中为字段分配默认值的示例是TIMESTAMP类型,该类型可以将CURRENT_TIMESTAMP设置为默认值。

+0

+1回答我的问题..幸运的是有另一种方式来解决潜在的问题问题 – lexu 2009-07-17 10:20:50

1

您可以使用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

+0

嗯..你回答了我的问题,并试图解决我的问题..看到我自己的答案.. – lexu 2009-07-17 10:03:32