你好,我有一张桌子,如下:
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
如何在单个查询中完成所有这些操作,并且如果在更新其他产品时出现错误,请应用包含甚至添加新记录的回滚。
答案 0 :(得分:2)
这两者“同时”完成:
UPDATE Master_Product
SET ID_OrderInform = ID_OrderInform + (ID_OrderInform > $NewitemOrderInform),
ID_OrderReport = ID_OrderReport + (ID_OrderReport > $NewitemOrderReport);
为了解释,... (id>$x)
是一个布尔表达式,其结果为false
或true
。 false
表示为0
; true
为1
。因此,这会将“正确”值(0或1)添加到每一列。
与此同时,PRIMARY KEY
是 UNIQUE KEY
,因此请删除多余的UNIQUE KEY KeyId (KeyId)
。
该表还有哪些其他查询?最好删除Inform
和Report
上的索引。为每个主UPDATE
更新每个行中的许多行需要花费大量的精力。而且,您可能只在需要有序列表时才提取所有行。
一个挑剔的人:BIGINT
太过分了。