4

Migrate from MySQL to PostgreSQL on Linux (Kubuntu)というタイトルの質問を熱心に読みました。スターウォーズのテーマは、それをはるかに面白くしました. しかし、PostgreSQLのUnique Constraintsに関する問題に遭遇しました。

上記の投稿に厳密に従って、 sqltを使用して PostgreSQL DDL を作成しました。考えられるプロセスは、最初にスキーマ/テーブルを作成してからデータをインポートすることでした。ただし、72 個のテーブルのうち 57 個が使用していますCONSTRAINT "userid" UNIQUE ("user_id", "key")

テーブルの 1 つの例を次に示します。

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")
);

pgadmin3 のクエリ ツールを使用してこれらのテーブルを PostgreSQL DB にコピーすると、次のエラーが発生します。

エラー: リレーション "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に感謝します ;-)

4

3 に答える 3

5

Unique Constraints に関するドキュメントを読むと、別のテーブルにある限り、同じ名前を使用しても問題ないようです。

ドキュメントのどの部分を読んでいるのかわかりませんが、誤解しています。制約名はグローバルに一意である必要があります。したがって、これらUNIQUE ("user_id", "key")は好きなだけ持つことができますが、すべてに名前を付けることはできません"user_id"

于 2011-03-20T12:49:41.433 に答える
3

制約に詳細な名前を付けることで、この種の問題を回避できます。

この種の問題を回避するには、データベース オブジェクトの命名基準を考え出す必要があります。type_schema_tablename_columnname のようなものかもしれません。たとえば、uidx_public_account_otherserviceinfor_user_id_key です。このタイプの名前は、問題がないことを確認し、エラー メッセージが参照しているオブジェクトを簡単に把握できるようにします。私が言ったことを実装するための最も明確な方法について議論することはできますが、重要なポイントは、あなたの環境で機能するすべてのオブジェクトに使用する標準を考え出すことです.

于 2011-03-20T18:32:33.153 に答える
2

user_id列名として既に使用されているため、制約名として使用しないでください。

于 2011-03-20T13:10:02.480 に答える