Почему INSERT IGNORE вставляет строки с одинаковым ПЕРВИЧНЫМ КЛЮЧОМ?

Я пытаюсь перенести данные из двух таблиц в одну и в разные базы данных с помощью этого запроса:

 INSERT IGNORE INTO 
  db2.customer(id, firstname,lastname,phone)

  SELECT customer.id,customer.firstname,customer.lastname,address.phone

  FROM db1.customer
  JOIN db1.address 
  ON customer.id = address.id_customer;

Я беру данные из db1 (таблицы клиентов и адресов) и вставляю их в db2 (таблица клиентов) и отлично работает. Но

  1. Если не использовать IGNORE, я получаю сообщение об ошибке дублирования первичного ключа.

      INSERT INTO 
         db2.customer(id, firstname,...
    
  2. Если я использую IGNORE, клиенты, у которых есть более одного адреса, вставляются дважды.

Почему INSERT IGNORE вставляет строки с одинаковым ПЕРВИЧНЫМ КЛЮЧОМ?

Почему оператор IGNORE не пропускает повторяющиеся значения?

Я пробовал использовать ON DUPLICATE KEY UPDATE, но в этом случае (2 разные базы данных) я не знаю, почему не работает.

db1 - это база данных Prestashop:

ps_address

Почему INSERT IGNORE вставляет строки с одинаковым ПЕРВИЧНЫМ КЛЮЧОМ?

ps_customer

Почему INSERT IGNORE вставляет строки с одинаковым ПЕРВИЧНЫМ КЛЮЧОМ?

А db2 - это настраиваемая база данных:

клиент

Как я могу пропустить (или обновить) строки с уже содержащимся идентификатором?

Я тоже пробовал:

 INSERT INTO 
  db2.customer(id, firstname,lastname,phone)

  SELECT DISTINCT 
  customer.id,customer.firstname,customer.lastname,address.phone

  FROM db1.customer
  JOIN db1.address 
  ON customer.id = address.id_customer;

Но не работает

С наилучшими пожеланиями

Столбец id_customer определяется как первичный ключ с автоинкрементом. Вы не должны указывать значение для такого столбца.

Gordon Linoff 06.04.2021 15:04

Вы говорите, что идентификатор клиента является первичным ключом таблицы клиентов, но после выполнения оператора вставки в этой таблице появляются повторяющиеся идентификаторы клиентов? Этого не должно быть.

Thorsten Kettner 06.04.2021 15:08

Как указал Гордон, не разбирайте ничего для автоматически увеличиваемых идентификаторов. Они сами установят идентификаторы соответствующим образом. Если вам нужен идентификатор после определенной вставки для переноса в другое место, вы можете использовать LAST_INSERT_ID(). Поскольку вы отметили prestashop, вы также можете использовать его на уровне PHP, Db::getInstance()->Insert_ID();. Если вам нужно избежать дублирования, используйте в своем заявлении ключевое слово DISTINCT.

Martin 06.04.2021 15:40

@ Мартин Я тоже пробовал. Но с SELECT DISTINCT все равно появляются дубликаты

JJMontalban 06.04.2021 17:07

@GordonLinoff Я знаю. В моей таблице custom table Customers мой первичный ключ не является автоинкрементным. Мне нужны идентификаторы

JJMontalban 06.04.2021 17:10

Я отредактировал вопрос

JJMontalban 06.04.2021 17:12

Опять же: id - это первичный ключ таблицы db2.customer, поэтому не может быть двух строк с одним и тем же id. Но после выполнения вашего оператора вставки таблица действительно содержит две строки с id 31755, несмотря на то, что id является первичным ключом. Да?

Thorsten Kettner 06.04.2021 18:08

@ThorstenKettner Да. Вы можете посмотреть скриншот моего hedisql. Заявление IGNORE сделайте это

JJMontalban 06.04.2021 20:27

Тогда ваша версия MySQL содержит ошибки. Первичный ключ должен предотвращать дублирование строк. IGNORE должен отклонять строки, которые нарушают ограничение первичного ключа. Демо: dbfiddle.uk/…

Thorsten Kettner 06.04.2021 21:26

Предоставьте определение таблицы для db2.customer. Я полагаю, что 2 предоставленных вами скриншота относятся к таблицам db1?

NickW 07.04.2021 01:40
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
10
37
0

Другие вопросы по теме