จะรีเซ็ตตารางเดี่ยวในรางได้อย่างไร?


คำตอบ:


27

หากต้องการรีเซ็ตดัชนี / คีย์หลักใน SQLite ให้พิมพ์:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")

1
ได้แรงบันดาลใจจากคำตอบของคุณ ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye

1
ในกรณีที่มีใครลองทำสิ่งนี้และได้รับข้อผิดพลาดฉันทำActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")และได้ผลเพราะจะทำให้ฉันมีข้อผิดพลาดที่พูดsqlite_sequence where name = 'yourtablename' is not a valid table nameหรืออะไรทำนองนั้น
l1zZY

185

ผู้คนจำนวนมาก (เช่นฉัน) มาที่นี่เพื่อค้นหาวิธีการลบข้อมูลทั้งหมดในตาราง ได้แล้ว:

$ rails console

> ModelName.delete_all

หรือ

> ModelName.destroy_all

destroy_all ตรวจสอบการอ้างอิงและการเรียกกลับและใช้เวลานานกว่าเล็กน้อย delete_all เป็นแบบสอบถาม SQL แบบตรง

ข้อมูลเพิ่มเติมที่นี่: http://apidock.com/rails/ActiveRecord/Base/delete_all/class


14
โซลูชันนี้จะรีเซ็ตรายการตาราง แต่ไม่ใช่คีย์หลัก
Justin D.

4
ใช่มันเยี่ยมมาก - แต่ฉันต้องการรีเซ็ตดัชนี! ทั้ง delete_all หรือ destroy_all ไม่ได้รีเซ็ตดัชนีเป็น 1
Kyle Clegg

คำตอบนี้ช่วยแก้ปัญหาของผู้ใช้ส่วนใหญ่ที่เข้าถึงได้ นั่นคือสิ่งที่สำคัญจริงๆ นอกจากนั้นยังไม่ใช่คำตอบเดียวและไม่ถูกตั้งค่าสถานะว่าเป็นคำตอบที่ถูกต้อง ผู้เขียนยังอธิบายความตั้งใจ เลยไม่เห็นมีปัญหา
Edison Machado

45

ฉันใช้สิ่งต่อไปนี้จากคอนโซลรางเพื่อลบทุกอย่างในตารางแล้วรีเซ็ตตัวนับดัชนี (Ruby 2 & Rails 4):

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')

3
สิ่งนี้ใช้งานได้ดีสำหรับฉัน แต่รายละเอียดเล็กน้อยคือคุณmodel_nameในคำสั่งรีเซ็ตจำเป็นต้องเป็นพหูพจน์เช่นชื่อจริงของตารางไม่ใช่ชื่อเอกพจน์ของโมเดล
Eli Duke

ยังใช้งานได้กับเวอร์ชันสัญลักษณ์: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice

18

ลิงค์ของ @ khelll มีประโยชน์ คำสั่งที่คุณต้องการตัดทอนหนึ่งตารางคือ:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")

16

เนื่องจาก Rails 4.2 คุณสามารถใช้truncateโดยตรงกับการเชื่อมต่อ ActiveRecord :

ActiveRecord::Base.connection.truncate(:table_name)

ซึ่งจะลบข้อมูลทั้งหมดและรีเซ็ตตัวนับการเพิ่มอัตโนมัติในตาราง ทำงานใน MySQL และ Postgres ไม่ทำงานใน Sqlite


10

เพิ่ม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

6

ฉันใช้ Rails 4.2.0 และ Sqlite3

นี่คือสิ่งที่ได้ผลสำหรับฉัน (โดยพิจารณาจากทั้งหมดข้างต้น):

$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")

จากนั้นฉันก็สามารถเพิ่มระเบียนใหม่ลงในตารางของฉันโดยดัชนีเริ่มต้นที่ 1


1

สำหรับใครก็ตามที่กำลังมองหาคำตอบสำหรับคำถามนี้เมื่อฐานข้อมูลเป็น Postgres คุณสามารถทำได้จากคอนโซล Rails:

rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")

โดยที่accountsในaccounts_id_seqคือชื่อของตาราง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.