MySQL Multi обновление вставляет дубликаты

0

У меня есть PHP-скрипт, который содержит много элементов <select>, чтобы обновить расписание. Каждый пользователь (6-значный идентификатор) может выбрать одно из мест (4-значный идентификатор) в день. Вот что это выглядит:

$_REQUEST

[
'2018-01-01'=>1234,
'2018-01-02'=>3456,
'2018-01-03'=>2345,
...
]
//The user 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    | 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
...

Любая помощь в получении этого обновления для работы будет принята с благодарностью!

  • 0
    Что представляет собой дубликат здесь? Кажется, что ваши примерные данные показывают, что пользователь может иметь только одну запись в день. Но ваш язык, кажется, подразумевает нечто иное, чем это.
  • 0
    Я сделаю правку
Теги:
sql-update

1 ответ

1

Непосредственное исправление вашей проблемы состоит в том, чтобы добавить уникальный индекс в комбинацию столбцов sid и date:

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

Затем, если пользователь пытается отправить дату, у которой уже есть запись, запрос завершится неудачно на уровне базы данных. Затем вы можете справиться с ошибкой в своем PHP-коде.

Но, с точки зрения удобства пользователей, было бы хорошо загрузить страницу и представить пользователю только даты, которые в настоящее время доступны. Здесь может пригодиться таблица календаря, к которой вы можете присоединиться к schedule_s для создания доступных дат.

  • 0
    Пользователь может свободно изменять свое расписание вплоть до самого дня. Таблица выложена с начала до конца года, поэтому запрос всегда должен выполнять обновление. Цель использования INSERT - просто выполнить обновление в одном запросе. Есть ли лучший способ сделать это?
  • 0
    @CurtisUpshall Разрешение на обновления усложняет ситуацию, но я думаю, что уникальное ограничение, которое я предложил, должно быть частью решения. Я постарался охватить сторону пользовательского интерфейса, потому что, хотя вы, безусловно, можете полагаться на MySQL для обнаружения дубликатов, было бы лучше, если бы вы избегали представления раскрывающегося списка своему пользователю, который мог бы привести к дублированию.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню