2011-03-20 25 views
4

我非常熱情地閱讀題爲Migrate from MySQL to PostgreSQL on Linux (Kubuntu)的問題。 星球大戰主題使它更具娛樂性。但是我遇到了PostgreSQL中關於唯一約束條件的問題。在PostgreSQL中創建表的唯一約束錯誤(從MySQL遷移)

我遵循上面的帖子,使用sqlt來創建PostgreSQL DDL。思考過程是首先創建模式/表,然後導入數據。但是我72桌57用CONSTRAINT "userid" UNIQUE ("user_id", "key")

這裏是其中的一個表的例子:

CREATE TABLE "account_otherserviceinfo" (
    "id" serial NOT NULL, 
    "user_id" bigint NOT NULL, 
    "key" character varying(50) NOT NULL, 
    "value" text NOT NULL, 
    PRIMARY KEY ("id"), 
    CONSTRAINT "user_id" UNIQUE ("user_id", "key") 
); 

當我複製這些表到我的PostgreSQL數據庫中pgadmin3使用的查詢工具,我得到的以下錯誤:

錯誤:關係 「USER_ID」 已經存在 SQL狀態:42P07

我沒有設計這個數據庫模式。我只幫助遷移過程。閱讀Unique Constraints上的文檔時,似乎只要它位於不同的表中就可以使用相同的名稱。 http://www.postgresql.org/docs/8.3/static/ddl-constraints.html。我誤解了這個?

任何建議或指針將不勝感激。

謝謝!

PS:感謝https://stackoverflow.com/users/59087/dave-jarvishttps://stackoverflow.com/users/26534/michael-trausch你爲我這麼遠;-)

回答

5

When reading the documentation on Unique Constraints, it appears that it is Ok to use the same name as long as it's in a different table.

我不知道你正在閱讀的文檔的一部分,但你曲解它。約束名稱必須是全球唯一的。所以你可以儘可能多地使用這些UNIQUE ("user_id", "key"),但是你不能指定其中的每一個"user_id"

+0

感謝Catcall。我是PostgreSQL的新手。來自mySQL,這個約束是不適用的。 – 2011-03-24 02:37:48

+1

更確切地說,約束名稱在模式中必須是唯一的 – 2016-08-26 10:08:55

2

您不應該使用user_id作爲約束名稱,因爲它已被用作列名稱。

3

您可以通過給出約束更詳細的名稱來解決此類問題。

您將需要爲您的數據庫對象提出命名標準以避免此類問題。可能類似於type_schema_tablename_columnname。因此,例如uidx_public_account_otherserviceinfor_user_id_key。這種類型的名稱將確保您沒有問題,並可以輕鬆找出錯誤消息所指的對象。您可以辯論最明確的方式來實現我所說的內容,但重點是提出一個適用於您的環境的所有對象的標準。

+0

這是一個偉大的建議StarShip3000。我決定用django-admin.py syncdb重建表格。這使我可以在我的開發機器上測試PostreSQL。我有一個運行mySQL的活動網站[dzinebox](http://dzinebox.com)。在某個時候,我將不得不做一次數據遷移,並會牢記您的建議。 – 2011-03-24 02:43:58