ฉันต้องการให้ค่าคีย์หลักเริ่มจาก 1 อีกครั้ง
ฉันต้องการให้ค่าคีย์หลักเริ่มจาก 1 อีกครั้ง
คำตอบ:
หากต้องการรีเซ็ตดัชนี / คีย์หลักใน SQLite ให้พิมพ์:
$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")
และได้ผลเพราะจะทำให้ฉันมีข้อผิดพลาดที่พูดsqlite_sequence where name = 'yourtablename' is not a valid table name
หรืออะไรทำนองนั้น
ผู้คนจำนวนมาก (เช่นฉัน) มาที่นี่เพื่อค้นหาวิธีการลบข้อมูลทั้งหมดในตาราง ได้แล้ว:
$ rails console
> ModelName.delete_all
หรือ
> ModelName.destroy_all
destroy_all ตรวจสอบการอ้างอิงและการเรียกกลับและใช้เวลานานกว่าเล็กน้อย delete_all เป็นแบบสอบถาม SQL แบบตรง
ข้อมูลเพิ่มเติมที่นี่: http://apidock.com/rails/ActiveRecord/Base/delete_all/class
ฉันใช้สิ่งต่อไปนี้จากคอนโซลรางเพื่อลบทุกอย่างในตารางแล้วรีเซ็ตตัวนับดัชนี (Ruby 2 & Rails 4):
> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
model_name
ในคำสั่งรีเซ็ตจำเป็นต้องเป็นพหูพจน์เช่นชื่อจริงของตารางไม่ใช่ชื่อเอกพจน์ของโมเดล
ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)
.
ลิงค์ของ @ khelll มีประโยชน์ คำสั่งที่คุณต้องการตัดทอนหนึ่งตารางคือ:
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")
เนื่องจาก Rails 4.2 คุณสามารถใช้truncate
โดยตรงกับการเชื่อมต่อ ActiveRecord :
ActiveRecord::Base.connection.truncate(:table_name)
ซึ่งจะลบข้อมูลทั้งหมดและรีเซ็ตตัวนับการเพิ่มอัตโนมัติในตาราง ทำงานใน MySQL และ Postgres ไม่ทำงานใน Sqlite
เพิ่มgem 'database_cleaner'
ลงใน Gemfile ของคุณเรียกใช้$ bundle install
แล้ว:
> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])
คุณสามารถระบุตารางเพิ่มเติมได้:
> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])
หากคุณปล่อยพารามิเตอร์สุดท้ายไว้พารามิเตอร์จะตัดฐานข้อมูลทั้งหมด:
> DatabaseCleaner.clean_with(:truncation) # your database is truncated
ฉันใช้ Rails 4.2.0 และ Sqlite3
นี่คือสิ่งที่ได้ผลสำหรับฉัน (โดยพิจารณาจากทั้งหมดข้างต้น):
$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")
จากนั้นฉันก็สามารถเพิ่มระเบียนใหม่ลงในตารางของฉันโดยดัชนีเริ่มต้นที่ 1
สำหรับใครก็ตามที่กำลังมองหาคำตอบสำหรับคำถามนี้เมื่อฐานข้อมูลเป็น Postgres คุณสามารถทำได้จากคอนโซล Rails:
rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")
โดยที่accounts
ในaccounts_id_seq
คือชื่อของตาราง
Person.connection.execute('delete from people' )
Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )