복붙노트

[SQL] id 필드에 다시 씨앗으로 길을 레일

SQL

id 필드에 다시 씨앗으로 길을 레일

이 질문에 "순수 SQL"답을 발견했다. 방법이 특정 테이블의 ID 필드를 재설정, 레일에 있나요? 내가 왜이 작업을 수행 할 수 있습니까? 거의 100 개 이상의 행을하지만, 항상 다른 - 나는 끊임없이 데이터를 이동하지와 테이블을 가지고 있기 때문에. 지금 25K까지이며, 단지 어떤 점은 거기에 없다. 나는 매달 정도 id 필드의 리셋을 실행하기 위해 레일 응용 프로그램 (루퍼스 - 스케줄러) 내부의 스케줄러를 사용하여 계획입니다.

해결법

  1. ==============================

    1.나는 hgimenez의 답변에 따라 솔루션이 다른 하나 나왔다.

    나는 hgimenez의 답변에 따라 솔루션이 다른 하나 나왔다.

    나는 보통 SQLite는 또는 PostgreSQL을 하나와 함께 작동하기 때문에, 나는 단지 사람들을 위해 개발 한; 그러나 그것을 연장, MySQL은, 너무 번잡하지한다고 주장한다.

    이 내부의 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에 모습을주는 것이 좋습니다. 이것은 ID가 자동으로 리셋하는 처리. 이 같은 단지 선택된 테이블을 삭제를 알 수 있습니다 :

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

    2.당신은 결코 당신이 사용하고있는 DBMS 무엇을 언급하지 않습니다. 이 PostgreSQL을을 경우, 액티브 포스트 그레스 어댑터는 reset_pk_sequences이있다! 당신이 사용할 수 방법 :

    당신은 결코 당신이 사용하고있는 DBMS 무엇을 언급하지 않습니다. 이 PostgreSQL을을 경우, 액티브 포스트 그레스 어댑터는 reset_pk_sequences이있다! 당신이 사용할 수 방법 :

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

    3.난 당신이 데이터에 대한 상관 없어 가정 :

    난 당신이 데이터에 대한 상관 없어 가정 :

    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
    

    이 같은 속성으로 새로운 기록을 줄 것이다, 그러나 ID는 1에서 시작하고있다.

    이 테이블을 belongs_toing 뭐든지 터져 얻을 수 있습니다.

  4. ==============================

    4.대답의 @hgmnz을 바탕으로, 내가 좋아하는 ... 값 당신에게 순서를 설정합니다이 방법을 만들어 (만 포스트 그레스 어댑터 테스트를.)

    대답의 @hgmnz을 바탕으로, 내가 좋아하는 ... 값 당신에게 순서를 설정합니다이 방법을 만들어 (만 포스트 그레스 어댑터 테스트를.)

    # change the database sequence to force the next record to have a given id
    def set_next_id table_name, next_id
      connection = ActiveRecord::Base.connection
      def connection.set_next_id table, next_id
        pk, sequence = pk_and_sequence_for(table)
        quoted_sequence = quote_table_name(sequence)
        select_value <<-end_sql, 'SCHEMA'
          SELECT setval('#{quoted_sequence}', #{next_id}, false)
        end_sql
      end
      connection.set_next_id(table_name, next_id)
    end
    
  5. ==============================

    5.한 가지 문제는 필드의 이러한 종류 등 다른 databases- 시퀀스, 자동 증가, 다르게 구현되어 있다는 것입니다

    한 가지 문제는 필드의 이러한 종류 등 다른 databases- 시퀀스, 자동 증가, 다르게 구현되어 있다는 것입니다

    당신은 항상 테이블을 삭제하고 다시 추가 할 수 있습니다.

  6. ==============================

    6.아니 레일에 같은 건 없다. 당신이 사용자에게 보여주기 위해 좋은 ID를 필요한 경우 별도의 테이블에 저장하고이를 다시 사용하십시오.

    아니 레일에 같은 건 없다. 당신이 사용자에게 보여주기 위해 좋은 ID를 필요한 경우 별도의 테이블에 저장하고이를 다시 사용하십시오.

  7. ==============================

    7._ids이 레일에 의해 설정되는 경우에만 레일에서이 작업을 수행 할 수있다. 만큼 _ids이 데이터베이스에 의해 설정되는 한, 당신은 SQL을 사용하지 않고 그들을 통제 할 수 없습니다.

    _ids이 레일에 의해 설정되는 경우에만 레일에서이 작업을 수행 할 수있다. 만큼 _ids이 데이터베이스에 의해 설정되는 한, 당신은 SQL을 사용하지 않고 그들을 통제 할 수 없습니다.

    사이드 노트 : 나는 정기적으로 재설정 또는 방울과 순서를 재현는 순수한 SQL 솔루션이 아닐 것이라는 SQL 프로 시저를 호출에 레일을 사용하는 것 같아요,하지만 난 그 무엇을 당신에게있는 거 물어 생각하지 않습니다 ...

    편집하다:

    면책 조항 : 나는 레일에 대해 많이 알지 못한다.

    당신이 열 아이디의 first_name LAST_NAME있는 테이블이 있고 보통 테이블 (FIRST_NAME, LAST_NAME) 값을 삽입하면 SQL의 관점에서, ( '밥', '스미스')가 그냥 테이블에 삽입하는 쿼리를 변경할 수 있습니다 (ID, FIRST_NAME , LAST_NAME) 값 ([레일에 의해 변수 집합은, '밥'은 '스미스)이 방법은 _id 대신 SQL 자동 설정되는 변수에 의해 설정된다. 그 시점에서, (그것이 PK 경우 당신이 거기에 여전히있는 동안 당신이 동일한 값을 사용하지 않는해야하지만)을 _ids이 무엇인지를 통해 전체 제어 할 수 있습니다 레일.

    데이터베이스에 할당을 떠나려고하는 경우에, 당신이 뭔가 같은 (어떤 시간 일정에 따라)를 실행 레일을 가지고있다 :

    DROP SEQUENCE MY_SEQ;
    CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1;
    

    무엇 이건 순서는 테이블에 대한 ID를 제어합니다. 이것은 현재의 순서 없애, 새로운 하나를 생성합니다. 이것은 내가 당신 '리셋'시퀀스 알고있는 간단한 방법입니다.

  8. ==============================

    8.예를 들면위한 방법을 레일 MySQL은,하지만 테이블 사용자의 모든 데이터를 손실로 :

    예를 들면위한 방법을 레일 MySQL은,하지만 테이블 사용자의 모든 데이터를 손실로 :

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

    어쩌면 사람을 도움)

  9. ==============================

    9.CounterCache 방법이 있습니다 : https://www.rubydoc.info/docs/rails/4.1.7/ActiveRecord/CounterCache/ClassMethods 나는 Article.reset_counters Article.all.length를 사용 - 1과 작업에 보였다.

    CounterCache 방법이 있습니다 : https://www.rubydoc.info/docs/rails/4.1.7/ActiveRecord/CounterCache/ClassMethods 나는 Article.reset_counters Article.all.length를 사용 - 1과 작업에 보였다.

  10. from https://stackoverflow.com/questions/2097052/rails-way-to-reset-seed-on-id-field by cc-by-sa and MIT license