1

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

我有一张名为“剂量”的表格:

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时,剂量表中的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的值已自动更改。我能做些什么来追踪这个错误。

4

2 回答 2

4

自动初始化和更新中所述TIMESTAMP

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

[ deletia ]

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

[ deletia ]

以下规则描述了使用当前时间戳为默认值和自动更新值定义表中的第一个 TIMESTAMP 列的可能性,对于一个但不是另一个,或者两者都不是:

[ deletia ]

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

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

    创建表 t1 (
      ts TIMESTAMP 默认 CURRENT_TIMESTAMP
    );

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

    创建表 t1 (
      ts 时间戳默认 0
    );
于 2012-10-08T16:41:54.003 回答
1

这是表格第一timestamp列的默认行为。请参阅 MySQL 文档:TIMESTAMP 的自动初始化和更新

你可以改变它:

ALTER TABLE Dose 
  MODIFY COLUMN t_inj TIMESTAMP NULL
           DEFAULT CURRENT_TIMESTAMP ;

或者:

ALTER TABLE Dose 
  MODIFY COLUMN t_inj TIMESTAMP NULL
           DEFAULT NULL ;
于 2012-10-08T16:42:19.813 回答