表上的更新会更改另一个表中的字段

时间:2015-11-17 23:02:27

标签: mysql jdbc bitnami

我正在处理处理某些订单的网络应用程序。

我有两个表定义为

CREATE TABLE sent_orders (
  id INT NOT NULL AUTO_INCREMENT,
  code VARCHAR(45) NOT NULL,
  date_open TIMESTAMP NOT NULL,
  state VARCHAR(50) NOT NULL,
  direction VARCHAR(45) NOT NULL,
  PRIMARY KEY (id) )


CREATE TABLE orders (
  id INT NOT NULL AUTO_INCREMENT,
  state_id INT(11) NOT NULL,
  date_open TIMESTAMP NOT NULL,
  date_processed TIMESTAMP NULL,
  date_closed TIMESTAMP NULL,
  sent_order_id INT(11) NULL,
  PRIMARY KEY (id) ,
  INDEX fk_orders_3_idx (state_id ASC) ,
  INDEX fk_orders_5_idx (sent_order_id ASC) ,
  CONSTRAINT fk_orders_1
    FOREIGN KEY (state_id)
    REFERENCES order_states (id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT fk_orders_2
    FOREIGN KEY (sent_order_id)
    REFERENCES sent_orders (id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

订单处理在不同时间由两个步骤组成:

  1. 使用特定的date_open和带有

    的null sent_order_id插入订单
    insert into orders (...,date_open,..) values(...,?,...)
    
  2. 使用不同的date_open

    插入sent_order
    insert into sent_orders (...,date_open,..) values(...,?,...)
    
  3. 在订单表上进行更新,以在sent_orders

    上添加外键
    update orders set sent_order_id = ? where id = ?
    
  4. 问题在于,当我在订单表上运行更新时,orders.date_open字段会更新当前日期。

    另一个奇怪的事情是,为了调试问题,我添加了第二个日期字段' date_open2'在订单表上然后我运行了一个大规模的更新:

    alter table orders add date_open2 TIMESTAMP NOT NULL;
    update orders set date_open2 = date_open;
    

    现在我跑的时候

    select date_open,date_open2,id,sent_order_id from orders
    

    我所拥有的是:

    date_open               date_open2              id          sent_order_id
    2015-11-17 23:35:14.0   2015-11-17 23:34:27.0   8654        678
    

    date_open2是原始的date_open,但它应该等于date_open字段!这意味着更新查询获得了正确的日期值,但是当我选择它时,它是错误的。

    Mysql实例:

    • bitnami wampstack-5.4.25-0 with MySQL Server 5.5

1 个答案:

答案 0 :(得分:2)

您的TIMESTAMP列将按照

中的说明自动更新

11.3.5 Automatic Initialization and Updating for TIMESTAMP

具体地

  

既没有DEFAULT CURRENT_TIMESTAMP也没有ON UPDATE CURRENT_TIMESTAMP,它与指定DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP相同。

听起来您要么想要修改TIMESTAMP列的自动更新行为,要么改为使用DATETIME列。