" INSERT ... ON DUPLICATE KEY UPDATE id = id"仍然在重复

时间:2017-12-05 17:26:35

标签: php mysql sql

我有一个表名" slot_place_box"。它看起来像这样:

  • id_slot_pb(PRIMARY KEY)
  • id_place_box(INT)
  • 日期(DATE)
  • 小时(小时)
  • slot_available(INT)

我有一个UNIQUE索引(id_place_box + date + hour)。

在PHP中我构建一个SQL请求,它看起来像这样:

$sql_request = "
INSERT INTO media.slot_place_box (id_place_box, date, hour)VALUES (32, '2017-12-10', NULL)ON DUPLICATE KEY UPDATE id_place_box = id_place_box;
SET @id = (SELECT SPB.id_slot_pb FROM media.slot_place_box as SPB WHERE 
SPB.id_place_box = 32 AND SPB.date = '2017-12-10' AND SPB.hour IS NULL);
INSERT INTO media.slot_config (id_config, id_slot_pb) VALUES (125, @id);

INSERT INTO media.slot_place_box (id_place_box, date, hour)VALUES (32, '2017-12-11', NULL)ON DUPLICATE KEY UPDATE id_place_box = id_place_box;
SET @id = (SELECT SPB.id_slot_pb FROM media.slot_place_box as SPB WHERE SPB.id_place_box = 32 AND SPB.date = '2017-12-11' AND SPB.hour IS NULL);
INSERT INTO media.slot_config (id_config, id_slot_pb) VALUES (125, @id);

INSERT INTO media.slot_place_box (id_place_box, date, hour)VALUES (32, '2017-12-12', NULL)ON DUPLICATE KEY UPDATE id_place_box = id_place_box;
SET @id = (SELECT SPB.id_slot_pb FROM media.slot_place_box as SPB WHERE SPB.id_place_box = 32 AND SPB.date = '2017-12-12' AND SPB.hour IS NULL);
INSERT INTO media.slot_config (id_config, id_slot_pb) VALUES (125, @id); 

//etc

";

我的问题是我的" INSERT ... ON DUPLICATE KEY UPDATE"当我有一个重复的键时,仍然会插入一个新行(=另一个" slot_place_box"在数据库中使用相同的" id_place_box + date + hour",所以我的@id获得了多个结果,脚本错误。它只是在我的表中为我的第一个" INSERT"添加了一行,并且在我有重复行之后什么也没做。

现在这是我的线索:

  • 我添加了一个" UNIQUE" " id_config + date + hour"组合的索引,对于" ON DUPLICATE KEY"或者我绝对需要PRIMARY KEY?
  • 也许我的字段名称有问题" date"和"小时"?
  • 我有一个" NULL"价值为"小时"也许用我的UNIQUE索引造成一些麻烦......

您有什么想法吗?

1 个答案:

答案 0 :(得分:0)

@Solarflare在评论中说,我的问题是因为" NULL"我的领域的价值"小时" (见here)。

我无法使用他向我展示的解决方案解决方案(here),因为我使用的是MySQL 5.6而不是5.7。

我将不得不稍微更改我的请求或更改我的表格逻辑或将值放入" HOUR" (例如,否定)但我必须更改我使用此代码的部分代码" NULL"。