我正在开发一个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 的值已自动更改。我该怎么做才能跟踪这个错误。
答案 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 ;