Как занести данные в таблицу?

Духовность™

Продвинутый новичок
Как занести данные в таблицу?

Блин, столкнулся с такой задачей, хз как правильно данное решение организовать.

Допустим, мы имеем таблицу прав пользователей на какие-то действия. Не суть важно - просто пример.

У нас в таблице прав уже есть записи вида

id_user | id_action | ...
-------------------
1 | 11 | ...
1 | 22 | ...
1 | 33 | ...

В систему добавили новый action с id_action = 66.

Открыли панель редактирования юзера с id = 1, видим список всех actions. Напротив нового action отмеченный чекбокс не стоит - значения для этого action в таблице прав ещё нет.

Внимание, вопрос - после того, как отмечен чекбокс с новым action (id = 66), что должно произойти? Как записать в таблицу новую строку?

Мне интересна реализация кода.

$db->query('INSERT INTO ...')

я написать не могу - это вызовет ошибку для записей, которые уже есть в таблице.
Аналогично и UPDATE не могу написать.

Не ужто придется делать запрос на существование каждой отдельной записи и после этого выбирать UPDATE или INSERT?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
triumvirat
Возможно подойдет REPLACE
 

html_coder

Новичок
А в чем проблема - сделать INSERT в таблицу.

-~{}~ 23.12.07 22:16:

А что если перед вставкой удалить все записи с id_user = 1 и потом сделать один INSERT
 

Духовность™

Продвинутый новичок
Mr_Max
Слышали. Индекс UNIQUE надо создавать многостолбцовый?

-~{}~ 23.12.07 22:18:

А что если перед вставкой удалить все записи с id_user = 1 и потом сделать один INSERT
мне почему-то этот вариант кажется ахтунгом
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
html_coder
Это вариант.

triumvirat
почему-то этот вариант кажется ахтунгом
На чём это основано?
Таблица очень большая,
записей очень много,
операция выполняется очень часто
и "перестройка" индексов будет "ложить" сервер?

Индекс UNIQUE многостолбцовый
а его еще нет? ;)
 

Духовность™

Продвинутый новичок
На чём это основано?
да просто на мнении. а вдруг в момент между удалением записей и занесением новых значений электричество вырубиться?

это утрированно, но как-то это не очень хорошо по-моему.. хотя это работать будет, да.
 

berkut

Новичок
triumvirat надо допускать какую-то степень риска. не бабло-же ворочеешь. зачем тогда такие заморочки? ну у если тебе посчастливиться попасть на такую мизерную вероятность - не страшно. невыгодно с бизнес точки зрения так заморачиватся над каждой мелочью
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
REPLACE тут, как я понимаю, вообще не поможет
а вдруг в момент между удалением записей и занесением новых значений электричество вырубиться?
нет.

-~{}~ 23.12.07 22:29:

Если серезно.
Как пробовали?
Какие проблемы возникли?

-~{}~ 23.12.07 22:35:

Вообще операций по работе "с каждой" записью не избежать.
Допустим если таблица имеет вид
id_user | id_action | Allow
-------------------
1 | 11 | 1
1 | 22 | 1
1 | 33 | 1
где Allow - разрешения юзера то
Update всех записей в 0 по id_user.
Потом REPLACE

Если права доступа определяются наличием записи в БД, то
DELETE
потом INSERT
 

Духовность™

Продвинутый новичок
fixxxer
да, вроде то что надо! Хотя я вчера с REPLACE игрался, он тоже умеет это делать.

а какие ключи в данном примере нужно ставить? Первичный вроде тут не нужен? UNIQUE многостолбцовый?

-~{}~ 24.12.07 21:09:

Черте-что.

insert .. on duplicate key update, судя по документации, имеет вид

... [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]

т.е. мы пишем примерно следующее

PHP:
insert into test values(...) ON DUPLICATE KEY UPDATE col = val;
Т.е. после ON DUPLICATE KEY UPDATE мы указываем что обновлять, если производится вставка которая вызывает ошибку дублирующегося первичного или уникального ключа.

Допустим, у нас есть
PHP:
CREATE TABLE `test` (
  `id_user` int(11) NOT NULL,
  `id_action` int(11) NOT NULL,
  `access` int(11) NOT NULL,
  UNIQUE KEY `uk` (`id_user`,`id_action`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
и мы делаем INSERT-ы, то придется писать что-то типа

PHP:
insert into test values(1, 2, 3) ON DUPLICATE KEY UPDATE access = 3;
- т.е. ДВА РАЗА повторять значение (3 в даном случае)?
 

fixxxer

К.О.
Партнер клуба
insert в mysql можно записывать в том же виде что и в update:
INSERT INTO Table SET A=1, B=2...
так что не вижу проблем с двумя разами =)
 

Gas

может по одной?
triumvirat
кстати, в таких задачах обычно ж нужно удалять из базы права, с которых были сняты галки. У тебя так?
 

Духовность™

Продвинутый новичок
Gas
у меня будет так :)


Вообщем, решений этой задачи много

Можно удалять записи, как предложил html_coder

Можно юзать
insert .. on duplicate key update ...
можно и REPLACE

Я наверно остановлюсь на REPLACE.

Просто нужно поставить многостолбцовый индекс UNIQUE на поля таблицы в контексте примера - (`id_user`, `id_action`) и все будет прекрасно работать.
 
Сверху