MySQL自动更新日期字段

时间:2012-10-08 16:36:04

标签: mysql jdbc prepared-statement

我正在开发一个swing应用程序,在测试期间,我遇到了一些更新数据的问题。

我有一张名为'Dose'的桌子:

create table Dose (id_dose int auto_increment primary key ,
        id_cmd varchar(50),
        t_inj TimeStamp,
        a_inj int,
        id_e_d int,
        id_dose_inc varchar(50),
        poid int ,
        Constraint fkk_et_doses foreign key (id_e_d) references Etat_dose (id_e_d),
        Constraint fkk_et_cmds foreign key (id_cmd) references Commande (id_cmd)ON DELETE CASCADE);
id_e_d 字段引用 etat_dose 表中的id_e_d:

create table Etat_dose (id_e_d int primary key,
                    libele varchar(50));

当我将数据插入其中时,一切正常,因为我使用了查询:

Methodes.UpdateData("insert into Dose(id_cmd,t_inj,a_inj,id_e_d,id_dose_inc,poid)  values (?,?,?,?,?,?)", dose, 6);

但是当我更新 id_e_d 时,Dose表中的 T_inj 会自动更改为系统日期。例如:

之前我插入:

insert into doses values(1,'CMFDG121031-1',' 2012-10-02 10:30:55',400,1,'CMFDG121031-1-1',30)

当我编辑它时,我得到:

mysql> select * from dose where id_dose=1;
    +---------+---------------+---------------------+-------+--------+-----------------+------+
    | id_dose | id_cmd        | t_inj               | a_inj | id_e_d | id_dose_inc      | poid 
    +---------+---------------+---------------------+-------+--------+-----------------+------+
    |       1 | CMFDG121031-1 | 2012-10-02 10:30:55 |   400 |      1 | CMFDG121031-1-1 |   30 |
    +---------+---------------+---------------------+-------+--------+-------------------------

在更新中我执行:

update dose set id_e_d=2 where id_dose=1

我得到:

   mysql> select * from dose where id_dose=1;
    +---------+---------------+---------------------+-------+--------+-----------------+------+
    | id_dose | id_cmd        | t_inj               | a_inj | id_e_d | id_dose_inc      | poid 
    +---------+---------------+---------------------+-------+--------+-----------------+------+
    |       1 | CMFDG121031-1 | 2012-10-08 16:15:11 |   400 |      2 | CMFDG121031-1-1 |   30 |
    +---------+---------------+---------------------+-------+--------+-------------------------

正如您所看到的, T_inj 的值已自动更改。我该怎么做才能跟踪这个错误。

2 个答案:

答案 0 :(得分:4)

正如Automatic Initialization and Updating for TIMESTAMP所述:

  

TIMESTAMP数据类型提供自动初始化和更新到当前日期和时间(即当前时间戳)。您可以选择是否使用这些属性以及哪些列应具有这些属性:

     

[ deletia ]

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

[ deletia ]

     

以下规则描述了在表中定义第一个TIMESTAMP列的可能性,其中包含默认值和自动更新值的当前时间戳,一个而不是另一个,或两者都不包含:

     

[ deletia ]

     
      
  • 使用DEFAULT子句但没有ON UPDATE CURRENT_TIMESTAMP子句,该列具有给定的默认值,并且不会自动更新为当前时间戳。

         

    默认值取决于DEFAULT子句是指定CURRENT_TIMESTAMP还是常量值。使用CURRENT_TIMESTAMP时,默认值为当前时间戳。

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
         

    使用常量,默认值是给定值。在这种情况下,该列根本没有自动属性。

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT 0
    );
  •   

答案 1 :(得分:1)

这是表的第一个timestamp列的默认行为。请参阅MySQL文档:Automatic Initialization and Updating for TIMESTAMP

您可以使用以下命令进行更改:

ALTER TABLE Dose 
  MODIFY COLUMN t_inj TIMESTAMP NULL
           DEFAULT CURRENT_TIMESTAMP ;

或:

ALTER TABLE Dose 
  MODIFY COLUMN t_inj TIMESTAMP NULL
           DEFAULT NULL ;