2012-10-08 122 views
1

我正在开发一个swing应用程序,在测试过程中,我遇到了一些更新数据的问题。MySQL自动更新日期字段

我有一个称为 '剂量' 表:

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已被自动更改。我能做些什么来追踪这个错误。

+0

那就是(第一)'timestamp'表的列的默认行为。 –

回答

4

作为Automatic Initialization and Updating for TIMESTAMP下记载:

TIMESTAMP数据类型提供自动初始化和更新为当前日期和时间(即,当前的时间戳)。您可以选择是否使用这些属性和栏应该有他们:

[ deletia ]

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

[ deletia ]

以下规则描述了用于在一个表中与当前时间戳限定第一TIMESTAMP列两者的默认和自动更新值,对于一个的可能性,但没有其他的,或用于既:

[ deletia ]

  • 随着DEFAULT条款,但没有ON UPDATE CURRENT_TIMESTAMP条款中,C olumn具有给定的默认值,不会自动更新为当前时间戳。

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

    CREATE TABLE t1 (
        ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
    );

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

    CREATE TABLE t1 (
        ts TIMESTAMP DEFAULT 0 
    );
+0

非常感谢您的帮助和信息,问题解决:) –

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 ; 
+0

非常感谢您的帮助和信息,解决问题:) –