如何在保持外键参照完整性的同时在MySQL中进行行版本控制

时间:2012-09-21 14:39:48

标签: mysql database-design version-control foreign-keys percona

我的客户有一个动态变化的商业模式,他们销售产品 对于每日美元汇率,这意味着产品的定价每天都在变化 并且客户仍然希望保留已售产品的历史记录(price,date_sold)(此信息保存在订单表中)。

我能想到为客户端实现解决方案的唯一方法是使用行版本控制。 (他们使用MySQL作为数据库服务器)

这是我想要在保持参照完整性的同时实现的当前模式(就像原型一样),但是当我创建orders表时,我得到如下错误:

ERROR 1005 (HY000): Can't create table 'mydb.orders' (errno: 150)

这里的架构设计:

create table products (
 id int not null auto_increment,                                           
 prod_id int not null,
 name varchar(200) NOT NULL,
 price decimal(8,2) NOT NULL default 0,
 is_active boolean default 0,
 deleted boolean default 0,
 create_date timestamp NOT NULL default current_timestamp,
 end_date timestamp NOT NULL default '2030-01-01 00:00:00',
 primary key(id)                                                   
)engine=innodb;   

create table orders (
  id int not null auto_increment,
  prod_id int not null,
  foreign key(prod_id) references products(prod_id),
  date_sold timestamp NOT NULL default current_timestamp,
  primary key(id)
)engine=innodb;

为什么我无法为products表创建外键?我做错了什么?

任何建议都非常感谢,

谢谢!

FYI

  

数据库服务器设置

     
      
  • Percona MySQL 5.5.27
  •   
  • 我使用timestamps和boolean flags
  • 在db_layer中处理版本控制   

更新: 我必须在orders(prod_id)列上创建一个索引,正确的模式定义 对于订单表是:

 create table orders (
      id int not null auto_increment,
      prod_id int not null,
      index product_id(prod_id),
      foreign key(prod_id) references products(prod_id),
      date_sold timestamp NOT NULL default current_timestamp,
      primary key(id)
    )engine=innodb;

1 个答案:

答案 0 :(得分:1)

您要引用的列上需要有索引。尝试在products表中的prod_id上创建索引,然后尝试创建外键。

此外,为什么不在订单表中添加价格列,并在销售时复制当前的产品价格。这将提供您的历史记录,您无需维护产品记录的不同版本。