MySQL - выберите, где существуют поля, строки, если не вставить - PullRequest
0 голосов
/ 21 декабря 2011

Я хочу сделать все следующее в ОДНОМ ЗАПРОСЕ:

Даны некоторые данные Адрес, Город, Штат, Zip. Я хочу посмотреть, существует ли пользователь с этими данными, и если нет, вставить новую запись. Если это так, просто обновите дату, измененную на нем.

  1. SELECT user_id FROM userInfo WHERE Address = '123 Main ST' AND City = 'New York' AND State='NY' AND Zip = '12345'

  2. Если число больше 0 ...

  3. UPDATE userInfo SET modifiedDate = '' WHERE user_id = ИЗБРАННЫЙ user_id

  4. Остальное, если счет 0

  5. INSERT INTO userInfo (Address, City, State, Zip) VALUES ('123 Main ST', 'New York', 'NY', '12345')

Я хотел бы отметить, что поля Address и City, State и Zip НЕ являются ключами любого типа, поэтому REPLACE работать не будет. Кроме того, есть дополнительные данные, которые я хотел бы добавить в другой запрос, если он существует.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2011

Чтобы иметь возможность выполнять два разных запроса, вам нужно использовать хранимую процедуру.Попробуйте это:

CREATE PROCEDURE sp_UpdateIfNotExists()
BEGIN
DECLARE the_user_id INT; /* or whatever your data type is */
SELECT user_id
    INTO the_user_id
FROM userInfo 
WHERE Address = '123 Main ST' AND City = 'New York' AND State='NY' AND Zip = '12345'
CASE
    WHEN the_user_id IS NULL INSERT INTO userInfo (Address, City, State, Zip) VALUES ('123 Main ST', 'New York', 'NY', '12345');
    ELSE UPDATE userInfo SET modifiedDate = '' WHERE user_id = the_user_id
END

Затем просто выполните хранимую процедуру (с CALL sp_UpdateIfNotExists).Вы можете настроить это с параметрами и так далее, я использую их в веб-приложениях PHP.

0 голосов
/ 21 декабря 2011

Даже для того, чтобы SELECT работал, вам понадобится индекс (Штат, Город, Адрес).Для согласованности данных в индексе должно применяться ограничение UNIQUE.

Для частичного обновления существующих строк существует расширение, специфичное для MySQL: INSERT ... ON DUPLICATE KEY UPDATE

Чтобы узнать идентификатор затронутой существующей строки, вы можете использоватьLAST_INSERT_ID(expr) в предложении UPDATE INSERT, а затем прочитайте значение обычного LAST_INSERT_ID () или его эквивалент.

0 голосов
/ 21 декабря 2011

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

Если ваш фильтр не является уникальным ключом, вы не можете знать, какие из соответствующих строк должны быть обновлены, даже если вы напишете отдельные операторы.

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

Короче говоря: определите свой ключи обновите ваши индексы.

...