product = <Item id: 4, url: nil, memo: nil, created_at: "2015-11-07 09:48:36", updated_at: "2015-11-07 09:48:36", Totalweight: 390.0, Perweight: nil, price: 1000>
attr = {"id"=>4, "tag_list"=>"peanuts", "price"=>1000, "url"=>nil, "Totalweight"=>390, "memo"=>nil}

で、

product.update!(attr)

ないしは、

product.update_attributes!(attr)

で、activerecordを更新しようとしていますが、

SQLite3::ConstraintException UNIQUE constraint failed: items.id
!! #<ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: items.id: INSERT INTO "items" ("id", "price", "Totalweight", "created_at", "updated_at", "url") VALUES (?, ?, ?, ?, ?, ?)>

とエラーがでてしまいます。

Activerecordのupdateメソッドはidが同じという条件下に使用するものではないのでしょうか?
IDがUniqueじゃない! と言われてももちろんそうYO!と思ってしまうのですが、、
どうやってidが同じものを更新すればよいのでしょうか?
ググってもupdate, update_attributes, update_attributeしかでてきませんでした。

idがなければ、新しくインスタンスを作り、saveし、
そのidのレコードがあれば、更新するというようにしたいのです。

追記
エクセル, CSVのスプレッドシートを読み込むgemを使用しておりまして、
def self.import(file)のメソッドの、spreadsheetを読み込んだ
後、rowメソッドはgem rooによるものです。

gem "roo"
https://github.com/roo-rb/roo

  COLUMN = ["id","tag_list","price","url","Perweight","Totalweight", "memo", "id", "created_at", "updated_at"]

  def self.import(file)
    spreadsheet = open_spreadsheet(file)
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      if Item.find(row["id"]) then
        product = Item.new
        attr = row.slice(*COLUMN)
        # product.attributes = attr
        #updateやupdate_attributesには引数をハッシュで渡すよう。
        product.update(attr)
      else
        product = Item.new
        attr = row.slice(*COLUMN)
        product.attributes = attr
        product.save!
      end


    end
  end

  def self.open_spreadsheet(file)
    case File.extname(file.original_filename)
    when ".csv" then
      Roo::Spreadsheet.open(file.path, extension: :csv)
    when ".xls" then
      Roo::Spreadsheet.open(file.path, extension: :xls)
    when ".xlsx" then
      Roo::Spreadsheet.open(file.path, extension: :xlsx)
    else raise "Unknown file type: #{file.original_filename}"
    end
  end