小编典典

MySQL UNIQUE键不起作用

sql

我在库存表上建立类型,通过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拨。谁能提供一个解释为什么?我想念什么?

这是表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’]。前三个很容易,第四个是我们订购,想要出售但尚未收到的数量)。

我知道这是一个很大的钥匙,但是我被迫保持这种方式。我有很多建议将成本或条件移至产品表。我不能做到这一点。成本并不总是相同的,因为我们从拍卖或其他地方购买了很多东西,但成本和条件却千差万别。

我希望这有助于更多地解释我要做什么。


阅读 282

收藏
2021-04-22

共1个答案

小编典典

Mysql在唯一约束中允许多个NULL。在您的serial_number列中替换NULL为值并触发约束,请参见:

http://sqlfiddle.com/#!2/9dbd19/1

一个UNIQUE索引允许可以包含NULL的列使用多个NULL值

文件

使列NOT NULL并使用''为空。

2021-04-22