mysql插入多行,返回失败的行

时间:2010-04-09 13:14:42

标签: mysql

当我尝试在表格中插入(假设)30行时。

例如

    INSERT INTO customers(cust_name,
   cust_address,
   cust_city,
   cust_state,
   cust_zip,
   cust_country)
VALUES(
        'Pep E. LaPew',
        '100 Main Street',
        'Los Angeles',
        'CA',
        '90046',
        'USA'
     ),
      (
        'M. Martian',
        '42 Galaxy Way',
        'New York',
        'NY',
        '11213',
        'USA'
   ), ... ;

而且cust_name必须是唯一的。然后,我如何识别未能插入的记录,因为它们的cust_name已经存在?

有可能归还吗?

6 个答案:

答案 0 :(得分:5)

您可以使用3种不同的策略来处理多次插入中的UNIQUE索引或PRIMARY KEY错误:

  1. 如果在IGNORE语句中使用INSERT关键字,则执行INSERT语句时发生的错误将被视为警告,而其他行将被插入。

  2. 如果您在ON DUPLICATE KEY UPDATE语句中指定了INSERT关键字,并且插入的行会导致UNIQUE索引或PRIMARY KEY中的重复值,如您在语句中提到的那样执行旧行的UPDATE,例如,您可以在特殊情况下向先前插入的客户名称添加“(旧)”。

  3. 如果您使用REPLACE关键字而不是INSERT,如果UNIQUE索引或PRIMARY KEY中的值重复,则之前插入的行将是删除后,将插入新行。

  4. 阅读更多内容:

    http://dev.mysql.com/doc/refman/5.1/en/insert.html

    祝你好运。

答案 1 :(得分:4)

如果没有在insert语句中标记IGNORE子句,我会希望在尝试插入重复项时命令失败。使用IGNORE子句,该语句返回一个信息字符串,报告记录,重复项和警告的数量。

有关详细信息,请查看

  

http://dev.mysql.com/doc/refman/5.1/en/insert.html

并在页面上搜索“Duplicates”。这将带您到达详细解释的地方。但是,无法以这种方式获取有关哪些行失败的信息,并且我不知道有任何其他方法可以实现此目的。 mysqlimport实用程序和LOAD DATA INFILE语句也没有这样的选项。

因此,如果我真的需要这样做,我会为它编写一个脚本。

答案 2 :(得分:3)

不了解您的要求,但拥有独特的客户名称并不是一个好主意

答案 3 :(得分:0)

据我所知,这是不可能的。

如果您使用其他语言插入数据,则可以一次插入一行并循环播放。通过这种方式,您可以轻松判断哪些行已失败。

答案 4 :(得分:0)

如果要在一个查询中插入多个记录,则无法轻松找出哪个记录​​无法添加。然而,您可以将此更改为30个语句,每个语句只插入一个记录,然后如果一个记录失效,您将立即得到它。

答案 5 :(得分:0)

我不确定你是否在那里使用虚拟数据,但是有任何理由,cust_name必须是唯一的,我可以理解ID密钥或其他东西,但肯定会有名称冲突的时候。电话簿中充满了欺骗条目,您是否可以在桌面上使用cust_id来代替识别?