专门针对特定订单的更新列

时间:2019-05-16 19:53:45

标签: mysql pdo

你好,我有一张桌子,如下:

DROP TABLE IF EXISTS `Master_Product`;
CREATE TABLE IF NOT EXISTS `Master_Product` (
  `KeyId_Product` bigint(21) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Id of table',
  `ID_OrderInform` bigint(21) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Order desire by user for ouput Inform Printed',
  `ID_OrderReport` bigint(21) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Order desire by user for ouput Report View Datatable',
  `Name_Product` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'PDF Name on disk',
  PRIMARY KEY (`KeyId`),
  UNIQUE KEY `KeyId` (`KeyId`),
  KEY `xID_OrderInform` (`ID_OrderInform`),
  KEY `xID_OrderReport` (`ID_OrderReport`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT;

每次插入新产品时,我都需要在表中填写订单和名称,但是我不能使用KeyId_Product对打印的Inform或View Datatables进行排序,因为某些用户需要使用所需的订单。 / p>

要获得这种可伸缩性,我需要使用2列aditional来存储所需的订单,当必须在2个现有产品之间插入新产品,并且必须推送具有更高订购索引的所有产品时,就会出现问题{{1 }}给新的空间。

我发现的唯一解决方案是使用2个附加查询来更新:

+1

其他

UPDATE 
    Master_Product
SET 
    ID_OrderInform = ID_OrderInform + 1 
WHERE 
    ID_OrderInform>$NewitemOrderInform

如何在单个查询中完成所有这些操作,并且如果在更新其他产品时出现错误,请应用包含甚至添加新记录的回滚。

1 个答案:

答案 0 :(得分:2)

这两者“同时”完成:

UPDATE  Master_Product
    SET ID_OrderInform = ID_OrderInform + (ID_OrderInform > $NewitemOrderInform),
        ID_OrderReport = ID_OrderReport + (ID_OrderReport > $NewitemOrderReport);

为了解释,... (id>$x)是一个布尔表达式,其结果为falsetruefalse表示为0true1。因此,这会将“正确”值(0或1)添加到每一列。

与此同时,PRIMARY KEY UNIQUE KEY,因此请删除多余的UNIQUE KEY KeyId (KeyId)

该表还有哪些其他查询?最好删除InformReport上的索引。为每个主UPDATE更新每个行中的许多行需要花费大量的精力。而且,您可能只在需要有序列表时才提取所有行。

一个挑剔的人:BIGINT太过分了。