当前位置: 首页 > 面试题库 >

MySQL UNIQUE键不起作用

邢硕
2023-03-14
问题内容

我在库存表上建立类型,通过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’]。前三个很容易,第四个是我们订购,想要出售但尚未收到的数量)。

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

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


问题答案:

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

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

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

文件

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



 类似资料:
  • 问题内容: 我与用户和角色之间有一个多对多的关系,并带有一个role_user表。我的迁移设置如下(简化): table: table: table: 因此,根据文档,我将我的外键设置为unsigned。 现在,我添加了几个用户,并附加了一些角色- 一切正常。但是,当我删除一个用户()时,该用户在表中的行不会被删除,这导致了多余的行。 我究竟做错了什么? MySQL + InnoDB 编辑:抓取模

  • 如果您在一个表上的非空列上使用计数,而没有任何where部分,则优化器只需返回该表中的行数。 如果您要求对一个唯一的非空列(如主键)进行非重复计数,答案应该是相同的,但是这次mariadb代替了。 如果您在其他表上留下了联接,但仍然没有 where 部分,则结果仍应为该表中的行数。 Mariadb 不使用千次优化是有原因的吗?是否存在未过滤主键的 DISTINCT 计数可以给出任何其他结果,然后该

  • 我正在使用用户密钥作为用户表中的主键 它总是显示这样的错误

  • 我正在开发一个Java Swing应用程序。我在内部的内部的。我可以键入,键盘上的每个键都能达到预期的效果,除了enter键。 选项卡和空格工作正常。当我按enter键,然后在启用换行的情况下键入到行尾时,我键入enter键的地方断行,这使我相信问题出在显示文本的方式上。我为提供了一个新的。注意,当我没有给一个新的时,enter键工作得非常好。

  • 问题内容: 我在通过jQuery .each()函数循环JSON的键/值时遇到问题 最初我有一个像这样的JSON: 我想遍历JSON中的所有键/值元素(aaa和bbb),并检索内部JSON数组以再次遍历,所以我尝试了 但是,我发现第一个.each()函数会将整个json视为单个结构,并且不会在其元素的键上循环。从.each()函数接收的data参数始终是原始json本身。我永远无法获得指向aaa和

  • 我有一个用户表,ID列作为主键。我有这个功能在控制器: 此函数不回显任何内容。如果我从$id更改为$name,如下所示: