2010-02-02 33 views
9

Tôi đang viết di chuyển để chuyển đổi ứng dụng không có đường ray thành định dạng phù hợp cho đường ray - một trong các bảng vì một số lý do không có tăng tự động được đặt trên cột id. Có cách nào nhanh chóng để bật tính năng này khi đang di chuyển, có thể với change_column hoặc một cái gì đó?Tạo thuộc tính gia tăng tự động bị thiếu với di chuyển đường ray

Trả lời

7

Bạn cần thực thi câu lệnh SQL.

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

Lưu ý đây chỉ là một ví dụ. Cú pháp câu lệnh SQL cuối cùng phụ thuộc vào cơ sở dữ liệu.

+0

cảm ơn rất nhiều @Simone Carletti, lãng phí cả ngày để giải quyết vấn đề, nhưng bây giờ nó giải quyết và nhờ DGM quá, cho postin g câu hỏi cụ thể cho trường hợp của tôi. Cả hai bạn có thể cho tôi ý tưởng về việc viết các thủ tục lưu sẵn trong đường ray 4.1 theo cách lạ mắt, hy vọng các bạn sẽ giúp tôi một lần nữa. Chúc mừng mã hóa. – roarfromror

+0

Tôi không biết nhiều hoạt động trong đường ray bằng cách sử dụng các thủ tục lưu sẵn - một số góc của đường ray có ít sử dụng cho các mặt mạnh hơn của SQL, những người khác chỉ không biết về nó ... dù sao, ít nhất bạn có thể sử dụng cùng một hình thức để viết SQL để tạo ra các thủ tục được lưu trữ. – DGM

6

Nếu bạn đang sử dụng postgesql, một yêu cầu sẽ không thực hiện được. Bạn sẽ cần tạo một chuỗi mới trong cơ sở dữ liệu.

create sequence users_id_seq; 

Sau đó, thêm cột id để bàn của bạn

alter table users 
    add id INT UNIQUE; 

Sau đó, thiết lập giá trị mặc định cho các id

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

Sau đó cư cột id. Điều này có thể khá dài nếu bảng có nhiều hàng

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

Hy vọng điều này giúp người dùng postgresql ...

+0

Cảm ơn! Điều này rất hữu ích! –

Các vấn đề liên quan