Я пытаюсь перенести данные из двух таблиц в одну и в разные базы данных с помощью этого запроса:
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 (таблица клиентов) и отлично работает. Но
Если не использовать IGNORE, я получаю сообщение об ошибке дублирования первичного ключа.
INSERT INTO
db2.customer(id, firstname,...
Если я использую IGNORE, клиенты, у которых есть более одного адреса, вставляются дважды.
Почему оператор IGNORE не пропускает повторяющиеся значения?
Я пробовал использовать ON DUPLICATE KEY UPDATE, но в этом случае (2 разные базы данных) я не знаю, почему не работает.
db1 - это база данных Prestashop:
ps_address
ps_customer
А 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;
Но не работает
С наилучшими пожеланиями
Вы говорите, что идентификатор клиента является первичным ключом таблицы клиентов, но после выполнения оператора вставки в этой таблице появляются повторяющиеся идентификаторы клиентов? Этого не должно быть.
Как указал Гордон, не разбирайте ничего для автоматически увеличиваемых идентификаторов. Они сами установят идентификаторы соответствующим образом. Если вам нужен идентификатор после определенной вставки для переноса в другое место, вы можете использовать LAST_INSERT_ID()
. Поскольку вы отметили prestashop, вы также можете использовать его на уровне PHP, Db::getInstance()->Insert_ID();
. Если вам нужно избежать дублирования, используйте в своем заявлении ключевое слово DISTINCT
.
@ Мартин Я тоже пробовал. Но с SELECT DISTINCT
все равно появляются дубликаты
@GordonLinoff Я знаю. В моей таблице custom table Customers мой первичный ключ не является автоинкрементным. Мне нужны идентификаторы
Я отредактировал вопрос
Опять же: id
- это первичный ключ таблицы db2.customer
, поэтому не может быть двух строк с одним и тем же id
. Но после выполнения вашего оператора вставки таблица действительно содержит две строки с id
31755, несмотря на то, что id
является первичным ключом. Да?
@ThorstenKettner Да. Вы можете посмотреть скриншот моего hedisql. Заявление IGNORE сделайте это
Тогда ваша версия MySQL содержит ошибки. Первичный ключ должен предотвращать дублирование строк. IGNORE
должен отклонять строки, которые нарушают ограничение первичного ключа. Демо: dbfiddle.uk/…
Предоставьте определение таблицы для db2.customer. Я полагаю, что 2 предоставленных вами скриншота относятся к таблицам db1?
Столбец
id_customer
определяется как первичный ключ с автоинкрементом. Вы не должны указывать значение для такого столбца.