4

我怀着极大的热情阅读了题为Migrate from MySQL to PostgreSQL on Linux (Kubuntu)的问题。星球大战的主题让它变得更加有趣。但是我遇到了一个关于PostgreSQL中唯一约束的问题。

我密切关注上面的帖子,使用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")
);

当我使用 pgadmin3 中的查询工具将这些表复制到我的 PostgreSQL 数据库中时,我收到以下错误:

错误:关系“user_id”已经存在 SQL 状态:42P07

我没有设计这个数据库模式。我只是帮助迁移过程。在阅读有关唯一约束的文档时,似乎可以使用相同的名称,只要它位于不同的表中即可。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 ("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 回答