2015-06-27 2 views
0

У меня есть БД, в которой я хотел бы, чтобы один из трех ключей (userId, udid и токен) идентифицировал строку: все три из них являются уникальными ключами, а первая также первичный и автоинкрементный. В принципе, я хотел бы обновить все значения, когда один из ключей один и тот же. К сожалению, если я использую:Использование INSERT ... ON DUPLICATE KEY UPDATE с несколькими ключами

INSERT INTO users (udid, nickname, playerID, `language`, app, token, 
`In Arrivo HD`) VALUES ('AB71C145-2FFE-4BA8-B0E7-9F121948C962', 'Fabry65', 'G:274138044', 'it_IT', 'In Arrivo HD', 
'605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450', NOW()+ INTERVAL 1 YEAR) 
ON DUPLICATE KEY UPDATE udid='AB71C145-2FFE-4BA8-B0E7-9F121948C962', 
token='605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450', lastAccess=NOW(), active=1, nickname='Fabry65', 
playerID='G:274138044',`language`='it_IT', app='In Arrivo HD' 

И ключ, который будет повторяться случается фишку, у меня есть ошибка:

Duplicate entry '605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450' for key 'token'

И то же самое было бы, конечно, если бы это был другой два других ключи, которые необходимо повторить. Цепочка ON DUPLICATE KEY UPDATE не работает. Как я могу это сделать?

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

ответ

0

Хорошо, я думаю, я нашел решение:

$query = "UPDATE users SET token='token', udid='$udid', lastAccess=NOW(), active=1, nickname='".$nickname."', playerID='".$playerID."',`language`='".$language."', app='".$app."' WHERE userId=$userId"; 
    $resultUpdate=$mysqli->query($query); 
    if (!$resultUpdate){ 
     $query = "UPDATE users SET udid='$udid', lastAccess=NOW(), active=1, nickname='".$nickname."', playerID='".$playerID."',`language`='".$language."', app='".$app."' WHERE userId=$userId" 
    } 

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

0

Ну, я думаю, вы неправильно поняли вариант ON DUPLICATE KEY. Вы не определяете, что должно произойти, если найден дубликат ключа.

Вот пример из MySQL Docs.

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

UPDATE table SET c=c+1 WHERE a=1; 

Это означает, что если дубликат ключа найден, c должен быть увеличен на 1 (c=c+1).

В вашем случае вы только что определили, если найден дубликат ключа, установите его в определенное значение. Это не ваше намерение, не так ли?

Возможно, вы просто хотите сгенерировать новый уникальный идентификатор и обновить столбец с этим значением? Нечто подобное, например:

INSERT INTO users (udid, nickname, playerID, `language`, app, token, 
`In Arrivo HD`) VALUES ('AB71C145-2FFE-4BA8-B0E7-9F121948C962', 'Fabry65', 'G:274138044', 'it_IT', 'In Arrivo HD', 
'605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450', NOW()+ INTERVAL 1 YEAR) 
ON DUPLICATE KEY UPDATE udid=uuid() -- which will generate a new Unique identifier for those column instead 
+0

На самом деле я закончил расщепление запроса. Я оставил это, убрав токенную часть, если userId был нулевым. В противном случае я сделал простое обновление для userId, учитывая, что этот идентификатор задан системой, и пользователь, следовательно, уже существует, если не null. –

+0

, но он не решает все: когда я это делаю: UPDATE пользователи SET token = '605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450', udid = 'AB71C145-2FFE-4BA8-B0E7-9F121948C962', lastAccess = NOW(), active = 1, nickname = 'Fabry65' , playerID = 'G: 274138044', 'language' = 'it_IT', app = 'В Arrivo HD' WHERE userId = 10025 с уже назначенным токеном, я все равно получаю дубликат. –

+0

Я добавил разъяснение. –

Смежные вопросы