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を更新すると、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の値は自動的に変更されています。このエラーを追跡するにはどうすればよいですか。

4

2 に答える 2

4

の自動初期化と更新に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 タイムスタンプ デフォルト 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 に答える