使用SQL插入多行,其中记录不存在

时间:2010-11-15 12:21:13

标签: sql mysql database

我想将多行数据插入MySQL数据库,但只有当我的order_id字段是唯一的时。这是我当前的查询,但不起作用。假设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);

感谢任何帮助。

汤姆

3 个答案:

答案 0 :(得分: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

谢谢大家。

答案 1 :(得分:1)

INSERT不支持WHERE子句,因为如果你插入它意味着记录当前不存在,那么WHERE子句就没有了看看。

如果插入中的INSERT字段与您想要的条件不匹配,那么在您给出的示例中执行此操作的方法就是不要调用order_id语句。

如果您多次调用INSERT,则会有某种代码(SQL或外部程序)循环插入您要插入的行;这将是你过滤它的地方。

答案 2 :(得分: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 / 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'语句,告诉您是否插入记录。