【问题标题】:MySQL error: `query': Duplicate entry '' for key 3 (Mysql2::Error) on a Ruby fileMySQL 错误:`query': Duplicate entry '' for key 3 (Mysql2::Error) on a Ruby file
【发布时间】:2011-06-09 20:03:09
【问题描述】:

这是我正在使用的代码

# update db
client = Mysql2::Client.new(:host => "localhost", :username => "jo151", :password => "password", :database => "jo151")

details.each do |d|
    if d[:sku] != ""
        price = d[:price].split

        if price[1] == "D"
            currency = 144
        else
            currency = 168
        end

        cost = price[0].gsub(",", "").to_f

        if d[:qty] == ""
            qty = d[:qty2]
        else
            qty = d[:qty]
        end 

        results = client.query("SELECT * FROM jos_virtuemart_products WHERE product_sku = '#{d[:sku]}' LIMIT 1;")
        if results.count == 1
            product = results.first


                            client.query("UPDATE jos_virtuemart_products SET product_sku = '#{d[:sku]}', product_name = '#{d[:desc]}', product_desc = '#{d[:desc]}', product_in_stock = '#{qty}' WHERE virtuemart_product_id = 
    #{product['virtuemart_product_id']};")

                client.query("UPDATE jos_virtuemart_product_prices SET product_price = '#{cost}', product_currency = '#{currency}' WHERE virtuemart_product_id = '#{product['virtuemart_product_id']}';")
            else
                client.query("INSERT INTO jos_virtuemart_products( product_sku, product_name, product_s_desc, product_in_stock)  VALUES('#{d[:sku]}','#{d[:desc]}','#{d[:desc]}','#{d[:qty]}');")
                last_id = client.last_id

                client.query("INSERT INTO jos_virtuemart_product_prices(virtuemart_product_id, product_price, product_currency) VALUES('#{last_id}', '#{cost}', #{currency});")
            end
        end
    end

`query':第 35 行的键 3 (Mysql2::Error) 的重复条目 '':

client.query("INSERT INTO jos_virtuemart_products( product_sku, product_name, product_s_desc, product_in_stock)  VALUES('#{d[:sku]}','#{d[:desc]}','#{d[:desc]}','#{d[:qty]}');")
                last_id = client.last_id

【问题讨论】:

    标签: mysql ruby insert key


    【解决方案1】:

    像这样插入带有任意内联字符串的原始 SQL 语句是极其危险的。您绝对必须转义任何放入其中的值,您的应用程序才能正常工作。您得到的第一个带有撇号的描述将导致您的 SQL 失败。

    在这种情况下,您将在每个字符串上使用client.quote。没有例外。您可能已经看到大量关于索尼遭到黑客攻击的新闻,正是由于此类错误,才会发生严重的违规行为。

    您应该研究使用 ORM 来帮助解决这个问题,即使是像 Sequel 或 DataMapper 这样简单的东西,因为它们提供了使这变得容易的工具。

    您获得重复键的原因是因为您在要插入的列之一上具有唯一索引,或者其中一列未指定并且具有与现有行冲突的默认值。

    【讨论】:

    • 感谢 tadman 的回答,表中有两个 UNIQUE 索引,它们不是我用来导入数据的索引,其中一个具有自动增量,另一个没有,它是不为空。引用:其中一列未指定,并且具有与现有行冲突的默认值。现在我怎么知道?我在桌面上使用 mysql 管理员作为远程 gui。
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2013-09-09
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多