Соблюдение unique_constraint без обновления первичного ключа - PullRequest
1 голос
/ 20 июня 2020

У меня есть таблица в mysql, скажем: ID - year - month

Я поместил unique_constraint на year и month. Таким образом, в году не может быть двух одинаковых месяцев.

ID используется для получения комбинации года и месяца. Допустим, у нас есть следующие значения:

ID -  year  -  month
1  -  20    -  1
2  -  20    -  2
3  -  20    -  5

Тогда ID 3 будет май 2020 года. Однако эта таблица создается динамически. Я загружаю определенные c данные и мне нужно вставить все комбинации лет и месяцев.

Сначала я использовал MySQL commando REPLACE INTO, потому что думал, что он не добавит неуникальную строку. И он не добавляет неуникальную строку, но обновляет ID каждый раз, что приводит к сбоям в моих внешних ключах.

Как мне это исправить? Просто используя INSERT? Из-за unique_constraint вставка просто выйдет из строя и вернет ошибку.

Теперь я исправил это следующим образом:

$conn = new mysqli(HOST, USER, PASS, DTBS);
         $stmt = $conn->prepare("SELECT ID FROM periods WHERE month=? AND year=?");
         $stmt->bind_param("ii", $month_, $year_);
         $month_ = $month;
         $year_ = $year;
         $stmt->execute();
         $stmt->bind_result($id);
         $stmt->fetch();
         $rows = $stmt->num_rows;
         $stmt->close();


         if ($rows == 0) {
             $stmt = $conn->prepare("INSERT INTO periods (year, month) VALUES (?, ?)");
             $stmt->bind_param("ii", $year_, $month_);
             $year_ = $year;
             $month_ = $month;
             $stmt->execute();
             $stmt->close();
         }
          $conn->close();

1 Ответ

1 голос
/ 20 июня 2020

Вы можете использовать INSERT ... ON DUPLICATE KEY:

insert into periods(year, month)
values (?, ?)
on duplicate key update year = values(year)

Это использует уникальное ограничение на (year, month). Когда встречается повторяющийся кортеж, MySQL не insert его, а переходит к предложению on duplicate key, где выполняется фиктивное обновление`.

...