SQL вставить в таблицу только если запись не существует [дубликат]
этот вопрос уже есть ответ здесь:
Проверьте, существует ли строка, в противном случае вставьте
11 ответов
Условная Вставка MySQL
12 ответов
я хочу запустить набор запросов к вставьте некоторые данные в таблицу SQL, но только если запись удовлетворяет определенным критериям. Таблица имеет 4 поля:id (первичный), fund_id,date и price
у меня есть 3 поля в запросе: fund_id,date и price.
поэтому мой запрос будет выглядеть примерно так:
INSERT INTO funds (fund_id, date, price)
VALUES (23, '2013-02-12', 22.43)
WHERE NOT EXISTS (
SELECT *
FROM funds
WHERE fund_id = 23
AND date = '2013-02-12'
);
поэтому я только хочу вставить данные, если запись соответствует fund_id и date уже не существует. Если вышеизложенное верно, это поражает меня как довольно неэффективный способ достижения этого в качестве дополнительного оператора select должен выполняться каждый раз.
есть ли лучший способ достижения выше?
Edit: для уточнения ни fund_id, ни date являются уникальными полями; записи, разделяющие один и тот же fund_id или дату, будут существовать, но ни одна запись не должна иметь тот же fund_id и дату, что и другая.
3 ответов:
Это может быть простое решение для этого есть:
INSERT INTO funds (ID, date, price) SELECT 23, DATE('2013-02-12'), 22.5 FROM dual WHERE NOT EXISTS (SELECT 1 FROM funds WHERE ID = 23 AND date = DATE('2013-02-12'));п.з. кроме того (если
IDпервичный ключ):INSERT INTO funds (ID, date, price) VALUES (23, DATE('2013-02-12'), 22.5) ON DUPLICATE KEY UPDATE ID = 23; -- or whatever you needпосмотреть эта скрипка.
хотя ответ, который я первоначально отметил как выбранный, правильный и достигает того, что я спросил, есть лучший способ сделать это (что другие признали, но не вошли). Составной уникальный индекс должен быть создан на таблице, состоящей из
fund_idиdate.ALTER TABLE funds ADD UNIQUE KEY `fund_date` (`fund_id`, `date`);затем при вставке записи добавьте условие, когда возникает конфликт:
INSERT INTO funds (`fund_id`, `date`, `price`) VALUES (23, DATE('2013-02-12'), 22.5) ON DUPLICATE KEY UPDATE `price` = `price`; --this keeps the price what it was (no change to the table) or: INSERT INTO funds (`fund_id`, `date`, `price`) VALUES (23, DATE('2013-02-12'), 22.5) ON DUPLICATE KEY UPDATE `price` = 22.5; --this updates the price to the new valueЭто обеспечит гораздо лучшую производительность для подзапроса и структуру таблицы превосходный. Он поставляется с оговоркой, что вы не можете иметь нулевые значения в ваших уникальных ключевых столбцах, поскольку они по-прежнему рассматриваются как значения MySQL.
предполагая, что вы не можете изменить DDL (чтобы создать уникальное ограничение) или ограничены только возможностью записи DML, затем проверьте значение null на отфильтрованном результате ваших значений против всей таблицы
скрипка
insert into funds (ID, date, price) select T.* from (select 23 ID, '2013-02-12' date, 22.43 price) T left join funds on funds.ID = T.ID and funds.date = T.date where funds.ID is null
Comments