如何在表格中存储重复的项目?

时间:2016-09-11 14:12:50

标签: mysql

我有三张桌子 用户表

CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
   PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci; 

项目表

CREATE TABLE IF NOT EXISTS `item` (
  `item_id` int(11) NOT NULL AUTO_INCREMENT,
  `item` varchar(20) NOT NULL,
  `price` int(3) DEFAULT NULL,
  `likes` int(4) DEFAULT NULL,
   PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci;

订单表

CREATE TABLE IF NOT EXISTS `order` (
  `user_id` int(11) DEFAULT NULL,
  `order_no` varchar(50) DEFAULT NULL,
  `item1` varchar(5) DEFAULT NULL,
  `item2` varchar(5) DEFAULT NULL,
  `item3` varchar(5) DEFAULT NULL,
  `item4` varchar(5) DEFAULT NULL,
  `item5` varchar(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci;

我将item_id存储在item1item2中,依次存储在订单表中。我只提供5个项目可以由用户选择,但他们可以增加任何项目的数量,如任何用户订单两个数量item1如何将其存储在数据库中。

以及任何改进表格的建议。

2 个答案:

答案 0 :(得分:2)

每个订单允许无限数量项目的最佳方法是使用另一个表格:

=SUMPRODUCT(--(B:B=Q63)*(E:E>0)*(F:F>0)*(E:E>F:F))

从订单表中删除五个CREATE TABLE IF NOT EXISTS `orderitem` ( `order_no` varchar(50), `itemid` INT, `qty` INT NOT NULL DEFAULT 1, `price` NUMERIC(9,2) NOT NULL, PRIMARY KEY (order_no, itemid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci; 列。

当用户将项item添加到上表时。因此,您对每个订单的商品数量没有限制。

只要您拥有多对多关系,此设计就是必需的。使用五列不是一个好主意,这会产生一个不方便的限制(如你所知)。

如果您想允许用户增加给定订单项的数量,请在此表中添加INSERT列。当他们选择添加更多数量的之前选择的相同项目时,请增加qty

此表格中还需要qty列。您需要记录当前订单中为该项目支付的价格,因为明天价格可能会发生变化。

重新评论:

price

阅读有关http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html的文档,了解其作用。

答案 1 :(得分:0)

一个建议是不要定义自己的id字段,除非你有一个非常具体的原因。大多数数据库都可以为您跟踪。如果你想定义自己的约束,你应该添加一个唯一的约束,和/或自动递增它。

我可能不理解这个问题,但听起来您希望能够更改项目中的值?我不太确定你在使用什么,但这里是sql documentation