9

在将测试数据播种到数据库表之前,我需要截断表(我需要重置主键),我试图这样做:

ActiveRecord::Base.connection.execute("TRUNCATE users")

但是当我从数据库中打印出数据时,我仍然看不到从 1 开始计算主键。

我究竟做错了什么?

编辑:

另外,我尝试在终端中手动运行到 PostgreSQL 数据库

truncate users

但是主要计数仍然不是从 1 开始的。

解决方案:

在 Postgres 中,运行:

ALTER SEQUENCE users_id_seq RESTART WITH 1;
4

4 回答 4

7

如果您的数据库是 postgres,您可以执行以下操作来截断模型的数据库表:

[
  MyModel1,
  MyModel2,
  MyModel3
].each do |m|
  ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{m.table_name} RESTART IDENTITY;")
end
于 2014-07-31T13:10:19.350 回答
7

MySQL中,TRUNCATE table;删除所有行重置自动增量计数器。

PostgreSQL中,它不会自动执行此操作。您可以使用TRUNCATE TABLE table RESTART IDENTITY;.

仅作记录:在SQLite中,没有TRUNCATE语句,而是

DELETE FROM table;
DELETE FROM sqlite_sequence WHERE name='table';
于 2013-02-26T22:46:39.307 回答
5

我回答这个问题为时已晚,但我希望这对其他人有帮助。

您必须安装(或者您可以添加gem 'database_cleaner'到您的 Gemfile)一个名为Database Cleaner的 GEM ,它有助于在不影响数据库架构的情况下

清理您的数据库。rake db:seed

DatabaseCleaner.clean_with(:truncation)

在种子文件的顶部。它将清除您的数据库并重新开始计数1


免责声明:这个更新的答案已经过测试,并且可以在我的系统中完美运行

于 2016-09-25T09:16:41.473 回答
0

From within Rails in a csv_upload.rb I used and it worked.

ActiveRecord::Base.connection.execute('TRUNCATE model_name RESTART IDENTITY')

于 2014-04-23T07:03:18.297 回答