Почему я получаю ошибку «Повторяющаяся запись» в запросе SELECT DISTINCT? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть следующий запрос для добавления данных в таблицу, если она уникальна:

INSERT INTO belgarath.players(tour_id, player_id, player_name_oc)
SELECT DISTINCT 0, ID_P, NAME_P FROM oncourt.players_atp
LEFT JOIN belgarath.players
    ON belgarath.players.tour_id = 0
    AND belgarath.players.player_id=oncourt.players_atp.ID_P;

Я запускаю его один раз для пустой таблицы, и все в порядке. Я удаляю строку и запускаю ее, ожидая, что MySQL добавит одну удаленную строку. Однако я получаю следующий код ошибки: Error Code: 1062. Duplicate entry '0-43042' for key 'players.unique_plyrs' . У меня есть уникальный ключ для tour_id и player_id, и он явно не работает, потому что я пытаюсь добавить повторяющуюся запись.

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

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Это должно решить вашу проблему. Поместите предложение Where, чтобы проверить наличие belgarath.players.player_id is NULL.

INSERT INTO belgarath.players(tour_id, player_id, player_name_oc)
SELECT DISTINCT 0, ID_P, NAME_P FROM oncourt.players_atp
LEFT JOIN belgarath.players
    ON belgarath.players.tour_id = 0
    AND belgarath.players.player_id=oncourt.players_atp.ID_P
WHERE belgarath.players.player_id is NULL;
0 голосов
/ 10 июля 2020

Надеюсь, эта подсказка, связанная с ключевым словом Distinct, вам поможет. Когда мы используем отдельный ключ, он обычно выбирает отдельные строки. Поэтому мы не можем ожидать, что он должен возвращать отдельные значения только для одного столбца, перед которым мы написали отдельный. Пример ниже лучше объяснит вам, что я пытаюсь сказать.

create table test(id1 int, id2 int);
insert into test values(1,1),(1,2),(1,3);

Здесь я создал тестовую таблицу, и когда я использую отдельное ключевое слово, используемое в запросе ниже

select distinct id1, id2 from test;

Тогда мы получим такой вывод:

id1 id2

1 1

1 2

1 3

Вы вставляете tour_ID как 0, и поскольку вы определили tour_id и player_id как уникальный ключ в таблице oncourt.players_atp. Таким образом, ваш запрос select каждый раз выбирает tour_id как «0». Поскольку запрос select с отличным получает действительно разные записи, например, player_id - 1,2,3, а имена - john, steve, bill соответственно, тогда запрос select вернет эти 3 записи, такие как (0, 1, john), (0, 2, steve), (0, 3, bill) и т. д.

Если ваша таблица oncourt.players_atp также имеет уникальное ограничение и эта таблица также содержит tour_id, вы можете просто скопировать оттуда идентификатор тура. Если tour_id там отсутствует и вы хотите сгенерировать его только в таблице belgarath.players, тогда в определении вашей таблицы вы можете определить идентификатор тура как автоинкремент, тогда он будет генерировать уникальный идентификатор там, и тогда вам не нужно выбирать tour_id в В вашем запросе вам просто нужно вставить player_id и player_name, как только вы определите tour_id как идентификатор автоинкремента. Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...