我在库存表上建立类型,通过6种不同的因素跟踪库存。我正在使用一个类似于此查询的查询:
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表具有一个唯一键(productid,factor1,factor2,factor3,factor4,factor5,factor6,serial_number)。由于某种原因,它不是拿起钥匙INSERT而是只拨而不是UPDATE拨。谁能提供一个解释为什么?我想念什么?
inventory
INSERT
UPDATE
这是表create语句:
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 = Warehouseid(仓库所在的仓库的唯一标识)
factor4 = locationid(位置的唯一字符串。其物理上画在架子上)
factor5 =费用(我们为每个数量支付的费用)
factor6 =条件(枚举[‘NEW’,’USED’,’RENTAL’,’PREORDER’]。前三个很容易,第四个是我们订购,想要出售但尚未收到的数量)。
我知道这是一个很大的钥匙,但是我被迫保持这种方式。我有很多建议将成本或条件移至产品表。我不能做到这一点。成本并不总是相同的,因为我们从拍卖或其他地方购买了很多东西,但成本和条件却千差万别。
我希望这有助于更多地解释我要做什么。
Mysql在唯一约束中允许多个NULL。在您的serial_number列中替换NULL为值并触发约束,请参见:
serial_number
NULL
http://sqlfiddle.com/#!2/9dbd19/1
一个UNIQUE索引允许可以包含NULL的列使用多个NULL值
文件
使列NOT NULL并使用''为空。
''