Вставка нескольких строк с SQL, где запись не существует - PullRequest
1 голос
/ 15 ноября 2010

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

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);

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

Tom

Ответы [ 3 ]

2 голосов
/ 15 ноября 2010

Решено с помощью 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

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

1 голос
/ 15 ноября 2010

Если бы я находился в аналогичной ситуации, я бы создал хранимую процедуру для обработки логики выяснения, существует ли уже 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 / VALUES:

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 в процедуру хранилища, чтобы указать, вставляет ли она запись.

1 голос
/ 15 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...