SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.03.2023 15:14:38

OlegR
Участник
Зарегистрирован: 14.06.2022
Сообщений: 21

Непонятки с INSERT

Добрый день.

Есть таблица:

CREATE TABLE `table1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `period_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`, `period_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 


В скрипте php создается временная таблица как клон вышеописанной таблицы:
CREATE TEMPORARY TABLE `tmp_table1` LIKE `table1`


И "убивается" основной ключ - он здесь не нужен. И не нужна автонумерация, которая есть в table1.
ALTER TABLE `tmp_table1`
DROP PRIMARY KEY,
CHANGE `id` `id` INT(10) UNSIGNED NULL


Записываю в tmp_table1 ОДНУ запись (на самом деле, естественно, записей очень много, но для теста добавляю только одну запись).
INSERT INTO `tmp_table1` VALUES (NULL, 77, 1)


В конце выполнения скрипта сбрасываю записи из tmp_table1 в основную таблицу table1:
INSERT INTO `table1`
SELECT * FROM `tmp_table1`


Получаю предупреждение:
Warning: PDO::exec(): SQLSTATE[23000]: Integrity constraint violation: 1062 Дублирующаяся запись '1-77' по ключу 'user_id'.

Т.е., при добавлении одной записи!
В чём может быть причина?

Кстати, это предупреждение получаю только при первом запуске скрипта после открытия браузера - последующие запуски скрипта в текущем сеансе работы браузера эту ошибку не вызывают.

Неактивен

 

#2 09.03.2023 15:59:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Непонятки с INSERT

Согласно   
UNIQUE KEY `user_id` (`user_id`, `period_id`)
комбинация полей (`user_id`, `period_id`) должна быть уникальна.

Неактивен

 

#3 09.03.2023 16:14:57

OlegR
Участник
Зарегистрирован: 14.06.2022
Сообщений: 21

Re: Непонятки с INSERT

И?
Какое дублирование может быть при единственной записи в таблице?

Прошу прощения, забыл уточнить - основная таблица `table1` пустая на момент запуска скрипта.
Более того - в начале скрипт просто делает ей операцию TRUNCATE, которая отрабатывает без ошибок.
После этой операции специально для проверки выводил в этом же скрипте COUNT(*) по этой таблице (без WHERE).

Отредактированно OlegR (09.03.2023 16:20:40)

Неактивен

 

#4 09.03.2023 16:34:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Непонятки с INSERT

Значит в момент выполнения

INSERT INTO `table1`
SELECT * FROM `tmp_table1`

уже не пустая. Как вариант, параллельно выполнялся тот же скрипт.

Неактивен

 

#5 09.03.2023 17:28:39

OlegR
Участник
Зарегистрирован: 14.06.2022
Сообщений: 21

Re: Непонятки с INSERT

Нет. Все это происходит на локальной машине. И запускается только один экземпляр браузера, в котором открыта только одна страница, по нажатию на кнопку в которой происходит запуск скрипта после подтверждения пользователем.

Я уже писал, что на самом деле в таблицу добавляется много записей. Но только эта одна запись вызывает предупреждение о дублировании. Если бы параллельно, вдруг, запускалось несколько экземпляров скрипта, то я бы получил столько предупреждений, сколько добавляется записей.

Неактивен

 

#6 09.03.2023 21:02:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Непонятки с INSERT

Ошибка однозначна. Исследуйте скрипт, чтобы понять почему он при первом запуске после открытия браузера пытается дважды добавить одну запись.
Дополнительно можно включить лог всех запросов со стороны mysql, может поможет разобраться откуда приходит лишняя запись.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson