mysql多重更新正在插入重复项

uwopmtnx  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(261)

我有一个php脚本,发布了许多 <select> 元素以更新明细表。每个用户(6位id)每天可以选择任何位置(4位id)中的一个。下面是它的样子: $_REQUEST ```
[
'2018-01-01'=>1234,
'2018-01-02'=>3456,
'2018-01-03'=>2345,
...
]
//The user's ID (sid) is missing from the request because a user
//can only update their own schedule; Their ID is stored in $_SESSION

我希望我的sql查询可以在一个查询中完成所有的表操作。一个警告是表中不能有任何重复项。明确地说,我所说的复制是指每个用户一天只能有一条记录。所以我使用了以下查询:
php+mysql

$params = array();
$days = 0; //Count the number of days to update
foreach ($_REQUEST as $date => $id) {
array_push($params,
$_SESSION['sid'],
$date,
$id
);
$days ++;
}
$value_string = str_repeat("(?,?,?),", $days - 1). "(?,?,?)";
$sql = "INSERT INTO schedule_s (sid, date, plan) VALUES $value_string
ON DUPLICATE KEY UPDATE date = VALUES(date), sid = VALUES(sid)";

我遇到的问题是,我的表中仍然有重复项。我发现想出一个解决方案有点棘手,因为每个列中肯定会有重复的SID和日志。
这是table的布局。

sid | date | log

123456 | 2018-01-01 | 1234
123456 | 2018-01-02 | 3456
123456 | 2018-01-03 | 2345
...
567890 | 2018-01-01 | 5678
567890 | 2018-01-02 | 5678
567890 | 2018-01-03 | 2345
...

任何帮助使这个更新工作将不胜感激!
6jygbczu

6jygbczu1#

立即解决问题的方法是在 sid 以及 date 柱:

ALTER TABLE schedule_s ADD CONSTRAINT cnstr UNIQUE (sid, date);

然后,如果用户试图提交一个已经有条目的日期,查询将在数据库级别失败。然后,您可以处理php代码中的失败。
但是,从用户体验的Angular 来看,最好加载页面并向用户显示当前可用的日期。在这里,日历表可能会派上用场,您可以加入其中 schedule_s 生成可用日期。

相关问题