我正在按类型构建库存表,该表通过6个不同的因素跟踪库存。我正在使用一个类似于以下的I查询:
INSERT INTO inventory ( productid, factor1, factor2, factor3, factor4, factor5, factor6, quantity, serial_number)
VALUES (242332,1,1,1,'V67',3.30,'NEW',10,NULL)
ON DUPLICATE KEY UPDATE `quantity` = VALUES(`quantity`) + quantity;
inventory
表有一个用于(production,factor1,factor2,factor3,factor4,factor5,factor6,serial_number)的UNIQUE KEY。出于某种原因,它没有抓住钥匙,只是INSERT
ing而不是UPDATE
ing。有人能解释一下为什么吗?我错过了什么?
这是表创建语句:
CREATE TABLE `inventory` (
`stockid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`productid` int(11) unsigned NOT NULL,
`factor1` int(11) unsigned NOT NULL,
`factor2` int(11) unsigned NOT NULL,
`factor3` int(11) unsigned NOT NULL,
`factor4` varchar(8) NOT NULL,
`factor5` decimal(10,2) NOT NULL,
`factor6` enum('A','B','C','D','NEW') NOT NULL,
`quantity` int(11) NOT NULL,
`stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`serial_number` varchar(11) DEFAULT NULL,
PRIMARY KEY (`stockid`),
UNIQUE KEY `serial_number` (`serial_number`),
UNIQUE KEY `productid_2` (`productid`,`factor1`,`factor2`,`factor3`,`factor4`,`factor5`,`factor6`,`serial_number`),
KEY `productid` (`productid`),
KEY `factor1` (`factor1`),
KEY `factor2` (`factor2`),
KEY `factor3` (`factor3`),
CONSTRAINT `books_stock_ibfk_2` FOREIGN KEY (`productid`) REFERENCES `produx_products` (`productid`),
CONSTRAINT `books_stock_ibfk_5` FOREIGN KEY (`factor1`) REFERENCES `table_factor1` (`factorid`),
CONSTRAINT `books_stock_ibfk_6` FOREIGN KEY (`factor2`) REFERENCES `table_factor2` (`factorid`),
CONSTRAINT `books_stock_ibfk_7` FOREIGN KEY (`factor3`) REFERENCES `table_factor3` (`factorid`)
)
ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=latin1
更深入:
此表的目的是保存库存数量。我认为这是非常直接的。分离这些数量的因素如下:
factor1=storeid(拥有此数量的商店的唯一标识符)。
factor2=supplierid(我们从中获得数量的供应商的唯一标识符)
factor3=仓库ID(仓库所在仓库的唯一标识符)
factor4=locationid(位置的唯一字符串。其物理绘制在货架上)
factor5=成本(我们为每个数量支付的费用)
factor6=条件(enum['NEW','USED','RENTAL','PREORDER']。前三个很容易,第四个是我们订购的数量,想出售,但还没有收到。)
我知道这是一把很重的钥匙,但我不得不这样保管。我有很多建议将成本或条件转移到产品表中。我不能这样做。成本并不总是一样的,因为我们从拍卖会或其他成本和条件变化很大的地方购买了很多东西。
我希望这有助于更多地解释我正在努力做什么
Mysql允许在一个唯一的约束中使用多个NULL。在serial_number
列中,将NULL
替换为值并触发约束,请参见:
http://sqlfiddle.com/#!2/9dbd19/1
UNIQUE索引允许为可以包含空
单据
将列设为NOT NULL,并使用空的''
。