2015-04-21 4 views
1

У меня есть таблица SQL, которая содержит список элементов, которые пользователи могут связать с их профилем. Таблица SQL выглядит примерно так:SQL Statement INSERT, в двойных столбцах UPDATE

Item_Activity_ID  Item_ID  User_ID  Status Date-Added  

    1     1   1    1   2015-06-08 
    2     2   2    1   2015-06-08 
    3     1   1    0   2015-06-09 

запись показывает, что кто-то с пользователем с идентификатором 1 добавленного элемента ид 1 дважды, и единственное, что было изменено была дата и статус. Я хочу сделать так, чтобы при введении оператора INSERT, таких как:

INSERT INTO items (Item_ID, User_ID, Status, Date_Added) VALUES ('$x', '$y', 1, CURDATE()) IF EXISTS SOME Item_ID = $x AND User_ID = $y UPDATE items SET Status = 1, Date_Added = CURDATE() WHERE Item_ID = $x AND User_ID = $y 

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

+1

Сохраненные процедуры ?? –

ответ

1
  • Во-первых, создать индекс по уникальный для Item_ID, UserID комбинации,

  • Затем используйте INSERT ... ON DUPLICATE KEY UPDATE statement:

    INSERT INTO items (Item_ID, User_ID, Status, Date_Added) 
    VALUES ('$x', '$y', 1, CURDATE()) 
    ON DUPLICATE KEY UPDATE Status = VALUES(Status), Date_Added = VALUES(Date_Added)) 
    

P.S. не забудьте очистить $x и $y, чтобы предотвратить инъекции SQL!

0

Попробуйте выполнить обновление сначала, предположив, что пользователь и элемент уже существуют. Затем проверьте, влияет ли это обновление на любые строки (используя @@ rowcount, в SQL Server). Если нет, тогда выполните вставку. Не забудьте поставить вышеприведенные два оператора в транзакцию ...;)

0

Нормальным способом было бы установить составное ограничение на уровне db. Если вы используете mysql и phpmyadmin, вы делаете это в представлении структуры таблицы.

Проверьте оба поля (я думаю, 'user_id' и 'item_id') и нажмите кнопку 'unique'.

После этого вы можете просто добавить ON DUPLICATE KEY UPDATE status =1, date_added=CURDATE().

Он обновит строку, нарушившего ограничение созданного

1

Я хотел бы начать с добавлением уникального ключа индекса:

ALTER TABLE items 
ADD CONSTRAINT uc_UserItem UNIQUE (Item_ID,User_ID); 

Затем, вы можете просто изменить свою вставку запрос:

INSERT INTO items (Item_ID, User_ID, Status, Date_Added) VALUES ('$x', '$y', 1, CURDATE()) ON DUPLICATE KEY UPDATE Status=VALUES(1), Date_Added=VALUES(CURDATE());