Skip to content

Commit 4931928

Browse files
committed
Fix insert_all to not update existing records
1 parent 6695ac7 commit 4931928

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -628,24 +628,26 @@ def default_index_type?(index) # :nodoc:
628628
end
629629

630630
def build_insert_sql(insert) # :nodoc:
631+
# Can use any column as it will be assigned to itself.
631632
no_op_column = quote_column_name(insert.keys.first) if insert.keys.first
632633

633634
# MySQL 8.0.19 replaces `VALUES(<expression>)` clauses with row and column alias names, see https://dev.mysql.com/worklog/task/?id=6312 .
634635
# then MySQL 8.0.20 deprecates the `VALUES(<expression>)` see https://dev.mysql.com/worklog/task/?id=13325 .
635636
if supports_insert_raw_alias_syntax?
637+
quoted_table_name = insert.model.quoted_table_name
636638
values_alias = quote_table_name("#{insert.model.table_name.parameterize}_values")
637639
sql = +"INSERT #{insert.into} #{insert.values_list} AS #{values_alias}"
638640

639641
if insert.skip_duplicates?
640642
if no_op_column
641-
sql << " ON DUPLICATE KEY UPDATE #{no_op_column}=#{values_alias}.#{no_op_column}"
643+
sql << " ON DUPLICATE KEY UPDATE #{no_op_column}=#{quoted_table_name}.#{no_op_column}"
642644
end
643645
elsif insert.update_duplicates?
644646
if insert.raw_update_sql?
645647
sql = +"INSERT #{insert.into} #{insert.values_list} ON DUPLICATE KEY UPDATE #{insert.raw_update_sql}"
646648
else
647649
sql << " ON DUPLICATE KEY UPDATE "
648-
sql << insert.touch_model_timestamps_unless { |column| "#{insert.model.quoted_table_name}.#{column}<=>#{values_alias}.#{column}" }
650+
sql << insert.touch_model_timestamps_unless { |column| "#{quoted_table_name}.#{column}<=>#{values_alias}.#{column}" }
649651
sql << insert.updatable_columns.map { |column| "#{column}=#{values_alias}.#{column}" }.join(",")
650652
end
651653
end

activerecord/test/cases/insert_all_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,10 @@ def test_insert_all_with_skip_duplicates_and_autonumber_id_given
188188
def test_skip_duplicates_strategy_does_not_secretly_upsert
189189
skip unless supports_insert_on_duplicate_skip?
190190

191-
book = Book.create!(author_id: 8, name: "Refactoring", format: "EXPECTED")
191+
book = Book.create!(format: "EXPECTED", author_id: 8, name: "Refactoring")
192192

193193
assert_no_difference "Book.count" do
194-
Book.insert({ author_id: 8, name: "Refactoring", format: "UNEXPECTED" })
194+
Book.insert_all([{ format: "UNEXPECTED", author_id: 8, name: "Refactoring" }])
195195
end
196196

197197
assert_equal "EXPECTED", book.reload.format

0 commit comments

Comments
 (0)