2016-03-05 3 views
0

Я смотрю на другие ресурсы, и я просто немного запутался. Я хотел бы привести пример к моей проблеме.INSERT if exists UPDATE

У меня есть игровой сервер, в котором хранится уникальный идентификатор от пара в базе данных, а вместе с ним есть столбец для определенных прав доступа к этому пользователю. EID id: 712309123810 разрешение: по умолчанию

Что я хочу достичь, это отправка данных из формы; Объявления $ Id и $. Вставьте эти данные в базу данных под столбцами, например, саке; «Идентификатор» и «Разрешение». Я могу это сделать, у меня возникают проблемы с пониманием того, как ОБНОВИТЬ только столбец $ разрешения, если $ id уже существует в db.

Я прочитал о ON DUPLICATE KEY UPDATE, но я смущен о том, как правильно его использовать. Я довольно новичок в mysql.

Спасибо за ваше время.

+0

Может ли 'id' иметь несколько разрешений? –

+0

Требуется одно разрешение Gordon –

ответ

0

on duplicate key срабатывает, когда вставляемая часть инструкции нарушает уникальное ограничение (в вашем случае - первичный ключ на id). Таким образом, чтобы поставить все это вместе:

INSERT INTO mytbale (id, permissions) 
VALUES (:id, :permissions) 
ON DUPLICATE KEY UPDATE permissions = :permissions 
0

Это объясняется довольно хорошо в руководстве: http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

Ваш запрос может быть что-то вроде:

INSERT INTO myTable (id, permissions) VALUES (712309123810, "default") 
ON DUPLICATE KEY UPDATE permissions = "default"; 

Это требует, чтобы таблица содержит уникальный или первичный ключ в столбце id.

Обычно, если вы попытаетесь вставить новую строку, которая создаст дублирующее значение для уникального или первичного ключа, это ошибка. Использование ON DUPLICATE KEY UPDATE изменяет: вместо этого ваша вставка преобразуется в обновление.

Пример запроса, который я дал, вставляет новую запись, если ни один из этих идентификаторов не существует, или он будет обновлять разрешения существующего.

+0

Спасибо за ваш ответ –

0

Обычно id может иметь несколько разрешений. Если это так, вы не хотите перезаписывать разрешения; вы хотите их накопить. Если это так, то вам может понадобиться распределительную таблицу справиться с этим:

create table UserPermissions (
    UserPermissionsId int auto_increment primary key, 
    UserId int not null, 
    PermissionId int not null, 
    constraint fk_UserPermissions_UserId foreign key UserId references Users(UserId), 
    constraints fk_UserPermissions_PermissionId foreign key Permissions references Permissions (PermissionId) 
); 

Если пользователь имеет только один разрешение, которое получает перезаписаны, то on duplicate key update уместно.

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