2011-03-16 18 views
21

我創建了一個沒有主鍵的表(:id => false),但現在它已經回來咬我的屁股。我如何在rails中追溯添加主鍵到我的表中?

我的應用程序已經投入生產,我不能放棄它並重新創建另一個應用程序。

有沒有辦法運行遷移來向我的表添加另一個自動增量主鍵列?

+1

您正在使用哪種數據庫引擎? – Augusto 2011-03-16 16:40:42

+0

請務必測試您在測試系統上所做的任何更改,而不是生產上的更改! – 2011-03-16 16:44:00

+0

sqlite正在開發中,但PostgreSQL正在開發中 – 2011-03-16 16:48:27

回答

1

我知道mySQl中可以添加一個具有默認增量值的列。 如果添加,那麼每行將有一個唯一的int值(並且任何新行將獲得大於最後一行添加的int值1)

您可以添加此列並將其設置爲主鍵。

+0

是否有軌道的做法呢? – 2011-03-16 16:51:07

+0

或者SQL語句是否可以用於sqlite和PostgreSQL? – 2011-03-16 16:51:36

0

這是一個連接表,現在需要成爲一個真正的主鍵模型?如果是這樣,你最好的選擇是創建新表並將數據複製到其中。

+0

將數據傳輸到新表格的最佳方法是什麼? – 2011-03-16 16:53:51

35

的命令添加在遷移主鍵是:

add_column :my_table, :id, :primary_key

然而,你的問題的措辭表明,你的表已經有一個自動增量列。除非我弄錯了,否則有幾個DBMS不允許在一個表上使用多個自動增量列。

如果您已經擁有一個自動遞增列,你真的想使用該列作爲主鍵,只需添加以下模型:

set_primary_key "my_existing_column"

或者在較新版本的扶手:

self.primary_key = "my_existing_column"

在你已經有一個自動遞增列,你不能使用它作爲主鍵,你可能是出於運氣的情況下。

+0

謝謝。非常有用的信息。 – 2013-05-30 14:36:20

+1

看起來像set_primary_key不存在了https://github.com/composite-primary-keys/composite_primary_keys/issues/83 – frankpinto 2015-09-08 06:26:35

2

如果由於某種原因您創建了一個帶有自定義id字段的表格,但忘記將id設置爲主鍵,則需要運行遷移以創建主鍵約束。以下是針對PostgreSQL數據庫進行測試的:

class AddPrimaryKeyConstraintToFoobars < ActiveRecord::Migration 
    def up 
    execute "ALTER TABLE foobars ADD PRIMARY KEY (id);" 
    end 

    def down 
    execute "ALTER TABLE foobars DROP CONSTRAINT foobars_pkey;" 
    end 
end