0

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

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

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

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;

为什么我无法为产品表创建外键?我究竟做错了什么?

非常感谢任何建议,

谢谢!

供参考

数据库服务器设置

  • Percona MySQL 5.5.27
  • 我使用时间戳和布尔标志在我的 db_layer 中处理版本控制

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

 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;
4

1 回答 1

1

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

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

于 2012-09-21T14:47:59.923 回答