MySql Query - команда INSERT INTO, но только без дубликатов - PullRequest
0 голосов
/ 01 сентября 2011

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

INSERT INTO selections (auctionid, selections.order)
VALUES 
((SELECT id FROM auctions, game WHERE auctions.BetfairMark = game.BetfairMarketID), 1,
((SELECT id FROM auctions, game WHERE auctions.BetfairMark = game.BetfairMarketID), 2,
((SELECT id FROM auctions, game WHERE auctions.BetfairMark = game.BetfairMarketID), 3

, но моя проблема заключается в том, как улучшить этот запрос, чтобы избежать появления одинаковых дубликатов в таблице при запускеэтот запрос?

Таблица выбора имеет 3 столбца: id, auctionid, order, где id - номер автоинкремента, сгенерированный для каждой новой записи.

Так что аукцион и ордер не должны совпадать со значениями в записи.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Добавьте UNIQUE INDEX к паре (auctionid, order).

ALTER TABLE selections ADD UNIQUE index_name (`auctionid`, `order`)

А когда вы вставляете, вы можете использовать INSERT IGNORE INTO ..., чтобы он игнорировал дубликаты, а не выдавал ошибку. (Полезно, когда вы используете пакетную вставку и ожидаются дубликаты)

0 голосов
/ 07 октября 2011

РЕШИТЬ! Создано 3 отдельных запроса для каждой строки, которые работают сейчас!

Таким образом, с добавленным УНИКАЛЬНЫМ ИНДЕКСОМ к паре (аукцион, ордер) получим этот работоспособный код:

INSERT IGNORE INTO
selections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
1,
PlayerA,
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID
;

INSERT IGNORE INTO
elections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
2,
PlayerB,
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID
;

INSERT IGNORE INTO
selections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
3,
'third text',
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID
;
...