You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6.1.7.2中destroy_by/where.destroy_all删除无id表记录报错

解决Rails无主键表批量删除报错问题

问题场景

尝试删除my_model表中foreign_id为"XXX"的多条记录,执行以下代码均报错:

MyModel.destroy_by(:foreign_id => "XXX")
# 或
MyModel.where(foreign_id: "XXX").destroy_all

控制台输出错误SQL及异常:

[3] pry(main)> MyModel.destroy_by(:foreign_id => "XXX")
  MyModel Load (0.4ms)  SELECT "my_model".* FROM "my_model" WHERE "my_model"."foreign_id" = $1  [["foreign_id", "XXX"]]
  TRANSACTION (0.4ms)  BEGIN
  MyModel Destroy (0.7ms)  DELETE FROM "my_model" WHERE "my_model"."" IS NULL
  TRANSACTION (0.4ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...TE FROM "my_model" WHERE "my_model"."" IS NULL
                                                             ^

from /home/rwilliams/.rvm/gems/ruby-2.7.6/gems/activerecord-6.1.7.2/lib/active_record/connection_adapters/postgresql_adapter.rb:672:in `exec_params'
Caused by PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...TE FROM "my_model" WHERE "my_model"."" IS NULL
                                                             ^

使用Rails版本:Rails 6.1.7.2

报错原因

Rails的ActiveRecord默认依赖**主键列(通常是id)**来定位记录并生成删除SQL。由于my_model表没有主键列,ActiveRecord无法找到用于定位记录的字段,最终生成了包含空标识符的错误SQL语句。

解决方案

方案1:添加主键列(推荐,符合Rails约定)

这是最稳妥的解决方式,适配Rails的默认行为:

  1. 生成迁移文件:
    rails generate migration AddIdToMyModel id:primary_key
    
  2. 执行迁移:
    rails db:migrate
    

迁移完成后,再次执行MyModel.where(foreign_id: "XXX").destroy_all即可正常删除记录,ActiveRecord会通过新增的id主键定位并删除数据。

方案2:不添加主键的临时处理(不推荐)

若无法添加主键,可尝试以下两种方式,但需注意潜在风险:

  • 指定自定义主键:如果表中存在其他唯一标识字段(比如foreign_id是唯一的),可在模型中声明:

    class MyModel < ApplicationRecord
      self.primary_key = :foreign_id
    end
    

    之后即可使用destroy_all等方法,但需确保指定的字段是唯一的,否则可能误删记录。

  • 执行原生SQL:直接通过原生SQL删除,绕过ActiveRecord的主键校验,但不会触发模型的回调方法(如before_destroy):

    ActiveRecord::Base.connection.execute("DELETE FROM my_model WHERE foreign_id = 'XXX'")
    

内容的提问来源于stack exchange,提问作者Ryan Pierce Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:07:40