MySQL UNIQUE键不起作用

时间:2014-03-03 20:07:08

标签: mysql 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表具有UNTIQUE KEY(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 = condition(enum ['NEW','USED','RENTAL','PREORDER')。前三个很容易,第四个是我们订购的数量,想卖,但没有收到了。)

我知道这是一个沉重的钥匙,但我不得不这样做。我有很多建议将成本或条件移到产品表中。我不能做到这一点。由于我们从拍卖或其他地方购买了大量成本和条件,因此成本并不总是相同。

我希望这有助于解释我想要做的事情。

1 个答案:

答案 0 :(得分:10)

Mysql允许在唯一约束中使用多个NULL。在serial_number列中,使用值替换NULL并触发约束,请参阅:

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

  

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

Docs

使列NOT NULL并使用空的''