table 的更新更改了另一个 table 中的字段

Update on a table changes a field in another table

我正在开发一个处理一些订单的网络应用程序。

我有两个 table 定义为

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. a sent_order插入了不同的date_open

    insert into sent_orders (...,date_open,..) values(...,?,...)
    
  3. 更新订单 table 以在 sent_orders

    上添加外键
    update orders set sent_order_id = ? where id = ?
    

问题是,当我 运行 更新订单 table 时, orders.date_open 字段会更新为当前日期。

另一个 st运行ge 事情是为了调试问题,我在订单 table 上添加了第二个日期字段 '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字段!这意味着更新查询得到了正确的日期值,但是当我select它时,它是错误的。

Mysql 实例:

您的 TIMESTAMP 列正在自动更新,如

中所述

11.3.5 Automatic Initialization and Updating for TIMESTAMP

具体

With neither DEFAULT CURRENT_TIMESTAMP nor ON UPDATE CURRENT_TIMESTAMP, it is the same as specifying both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP.

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