sql - learn - s3 school html



القضبان طريقة لإعادة تعيين البذور في حقل معرف (6)

لقد وجدت إجابات SQL الخالصة على هذا السؤال. هل هناك طريقة في Rails لإعادة تعيين حقل المعرف لجدول معين؟
لماذا أريد أن أفعل هذا؟ لأن لدي جداول مع نقل البيانات باستمرار - نادرا ما أكثر من 100 صف ، ولكن دائما مختلفة. إنه الآن يصل إلى 25 ألفًا ، وليس هناك أي فائدة في ذلك. أنوي استخدام برنامج جدولة داخلي لتطبيق Rails (rufus-scheduler) لتشغيل حقل المعرف شهريًا أو نحو ذلك.

https://src-bin.com


Answer #1

أفترض أنك لا تهتم بالبيانات:

def self.truncate!
  connection.execute("truncate table #{quoted_table_name}")
end

أو إذا قمت بذلك ، ولكن ليس كثيرًا (هناك شريحة من الوقت توجد فيها البيانات فقط في الذاكرة):

def self.truncate_preserving_data!
  data = all.map(&:clone).each{|r| raise "Record would not be able to be saved" unless r.valid? }
  connection.execute("truncate table #{quoted_table_name}")
  data.each(&:save)
end

سيعطي هذا سجلات جديدة ، بنفس السمات ، ولكن يبدأ معرف المستخدم في 1.

أي شيء belongs_to إلى هذا الجدول يمكن أن يحصل مشدود.


Answer #2

أنت لم تذكر ما DBMS الذي تستخدمه. إذا كان هذا هو postgreSQL ، فإن محول postgres ActiveRecord له reset_pk_sequences! الطريقة التي يمكنك استخدامها:

ActiveRecord::Base.connection.reset_pk_sequence!('table_name')

Answer #3

خرجت بحل قائم على إجابة hgimenez وهذا الحل الآخر .

بما أنني عادة ما أعمل مع Sqlite أو PostgreSQL ، فقد طورت فقط من أجل هؤلاء ؛ ولكن توسيع نطاقه إلى ، على سبيل المثال ، لا ينبغي أن يكون مزعجًا.

ضع هذا داخل lib / واطلبه على مُهيئ:

# lib/active_record/add_reset_pk_sequence_to_base.rb
module ActiveRecord
  class Base
    def self.reset_pk_sequence
      case ActiveRecord::Base.connection.adapter_name
      when 'SQLite'
        new_max = maximum(primary_key) || 0
        update_seq_sql = "update sqlite_sequence set seq = #{new_max} where name = '#{table_name}';"
        ActiveRecord::Base.connection.execute(update_seq_sql)
      when 'PostgreSQL'
        ActiveRecord::Base.connection.reset_pk_sequence!(table_name)
      else
        raise "Task not implemented for this DB adapter"
      end
    end     
  end
end

الاستعمال:

Client.count # 10
Client.destroy_all
Client.reset_pk_sequence
Client.create(:name => 'Peter') # this client will have id=1

تحرير: نظرًا لأن الحالة الأكثر شيوعًا التي ترغب في القيام بها هي بعد مسح جدول قاعدة البيانات ، أوصي بإلقاء نظرة على database_cleaner . يعالج إعادة تعيين معرف تلقائيا. يمكنك إخبارها بحذف الجداول المحددة فقط مثل هذا:

DatabaseCleaner.clean_with(:truncation, :only => %w[clients employees])

Answer #4

طريق القضبان على سبيل المثال MySQL ، ولكن مع فقدان جميع البيانات في users الجدول :

ActiveRecord::Base.connection.execute('TRUNCATE TABLE users;')

ربما يساعد شخص ما ؛)


Answer #5

مشكلة واحدة هي أن هذه الأنواع من الحقول يتم تنفيذها بشكل مختلف لمختلف قواعد البيانات - تسلسل ، والزيادات التلقائية ، الخ

يمكنك دائمًا إسقاط الجدول وإعادة إضافته.






database