2010-02-02 84 views
9

我正在编写一个迁移,将非rails应用转换为适合rails的正确格式 - 其中一个表由于某种原因没有在id列上设置自动增量。在迁移过程中是否有快速启用它的方法,可能是change_column或其他?使用rails迁移创建丢失的自动增量属性

回答

7

您需要执行一条SQL语句。

statement = "ALTER TABLE `users` CHANGE `id` `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT" 
ActiveRecord::Base.connection.execute(statement) 

注意这只是一个例子。最终的SQL语句语法取决于数据库。

+0

非常感谢@Simone Carletti酒店,浪费了整整一天来解决这个问题,但现在它的解决,感谢DGM也为postin g特定于我的案例的问题。你能不能以一种奇特的方式让我想起在rails 4.1中编写存储过程,希望你们能够再次帮助我。快乐的编码。 – roarfromror 2015-04-10 11:49:57

+0

我不知道在使用存储过程的rails中有太多活动 - rails的某些角落对于SQL的更强大的方面几乎没有用处,其他人只是不知道它......无论如何,至少您可以使用这同样的形式来编写SQL来创建存储过程。 – DGM 2015-04-10 19:33:58

6

如果你在postgesql上,一个请求不会产生。您需要在数据库中创建一个新的序列。

create sequence users_id_seq; 

然后将ID列添加到您的表

alter table users 
    add id INT UNIQUE; 

然后设置的默认值的ID

alter table users 
    alter column id 
     set default nextval('users_id_seq'); 

然后填充ID列。这可能是相当长,如果表中有许多行

update users 
    set id = nextval('users_id_seq'); 

希望这有助于PostgreSQL用户。...

+0

谢谢!这非常有帮助! – 2011-01-05 23:14:08

相关问题