2010-11-15 3 views
1

Я хочу вставить несколько строк данных в базу данных MySQL, но только тогда, когда поле order_id уникально. Это текущий запрос, который у меня есть, который не работает. Допустим, запись с order_id 2 уже в таблице:Вставка нескольких строк с SQL, где запись не существует

INSERT INTO conversion 
     (user_id,url_id,order_id,sale,commission,transaction_date,process_date) 
VALUES (1,1,1,'32',0.3995,'2010-11-15 12:15:18','2010-11-15 12:15:18'), 
     (3,6,2,'*not-available*',0.001975,'2010-11-15 12:15:18','2010-11-15 12:15:18') 
WHERE (order_id <> 3); 

Любая помощь приветствуется.

Том

+0

поэтому в вашем примере order_id равно 1 для обеих строк. что вы хотите сделать в таком случае? чего вы хотите достичь с помощью order_id <> 1? – Unreason

+0

'УНИКАЛЬНЫЙ' среди« ЦЕННОСТЕЙ »или за столом? Если в приведенном выше примере таблица уже содержит 1, должна ли какая-либо из записей сделать ее там? – Quassnoi

+0

Извинения - это плохой пример. Editted. – tommizzle

ответ

2

Решено использовать REPLACE.

Пример:

REPLACE INTO conversion (user_id,url_id,order_id,sale,commission,transaction_date,process_date) VALUES (1,1,3,'32',0.3995,'2010-11-15 12:50:31','2010-11-15 12:50:31'),(1,2,2,'*not-available*',0.001975,'2010-11-15 12:50:31','2010-11-15 12:50:31'); 

URL: http://dev.mysql.com/doc/refman/5.0/en/replace.html

Спасибо всем.

+0

heh.I почти включил это в свой ответ, но я решил не делать этого, потому что не думал, что это решит вашу конкретную проблему. Хорошо, я рад, что вы это решили. :) – Spudley

1

INSERT не поддерживает пункт WHERE, потому что если вы вставляя это означает, что запись на данный момент не существует, поэтому, следовательно, не было бы ничего для пункта WHERE смотреть.

Способ сделать это в приведенном ниже примере просто не называть оператор INSERT, если поле order_id в вашей вставке не соответствует критериям, которые вы хотите.

Если вы звоните INSERT несколько раз, у вас будет какой-то код (либо SQL, либо внешняя программа), который перемещается по строкам, которые вы вставляете; это будет именно то, где вы его отфильтровываете.

1

Если я в аналогичной ситуации, я бы создал хранимую процедуру для обработки логики выяснения, существует ли order_id.

--Run this first 
--It will create a stored procedure call InsertConversion 
--Begin of stored procedure 
CREATE PROCEDURE InsertConversion 
    @user_id int, 
    @url_id int, 
    @order_id int, 
    @sale varchar(5), 
    @commission money, 
    @transaction_date datetime, 
    @process_date datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

    if not exists(select order_id from conversion where order_id = @order_id) 
    begin 
     INSERT INTO conversion(user_id, url_id, order_id, sale, commission, transaction_date, process_date) 
     VALUES(@user_id, @url_id, @order_id, @sale, @commission, @transaction_date, @process_date) 
    end 
END 
GO 
--End of stored procedure 

После процедуры магазина создана, вы можете выполнить его и передать в том же значении, как вы могли бы пройти в INSERT/ЗНАЧЕНИЕ заявление:

exec InsertConversion 1,1,1,'32',0.3995,'2010-11-15 12:15:18','2010-11-15 12:15:18' 
exec InsertConversion 3,6,2,'*not-available*',0.001975,'2010-11-15 12:15:18','2010-11-15 12:15:18' 

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

+0

Фантастический ответ. Это определенно кажется намного более чистым, чем мое решение. Вы хоть представляете себе разницу в производительности? – tommizzle

+0

Из моего небольшого знания производительности БД я не вижу заметной разницы в производительности. Любому решению нужно будет искать существование order_id и вставить, когда он его не найдет. Возможно, я ошибаюсь, поэтому не принимайте мои слова. –

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