【问题标题】:Unique Constraint error creating tables in PostgreSQL (migrated from MySQL)在 PostgreSQL 中创建表的唯一约束错误(从 MySQL 迁移)
【发布时间】:2011-07-19 02:31:22
【问题描述】:

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

我密切关注上面的帖子,使用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 让我走到这一步;-)

【问题讨论】:

    标签: postgresql unique constraints database-migration


    【解决方案1】:

    阅读文档时 独特的约束,看来它 可以使用相同的名称,只要 它在不同的表中。

    我不确定您正在阅读文档的哪一部分,但您误解了它。约束名称必须是全局唯一的。因此,您可以拥有任意数量的UNIQUE ("user_id", "key"),但您不能命名每个"user_id"

    【讨论】:

    • 谢谢猫叫。我是 PostgreSQL 新手。来自不适用此约束的 mySQL。
    • 更准确地说,约束名称在模式中必须是唯一的
    【解决方案2】:

    您不应使用user_id 作为约束名称,因为它已被用作列名。

    【讨论】:

      【解决方案3】:

      您可以通过为约束提供更详细的名称来解决此类问题。

      您需要为数据库对象制定一个命名标准以避免此类问题。可能类似于 type_schema_tablename_columnname。例如 uidx_public_account_otherserviceinfor_user_id_key。这种类型的名称将确保您没有问题,并且可以轻松找出错误消息所指的对象。您可以讨论实现我所说的最清晰的方法,但关键是要提出一个标准,用于适用于您的环境的所有对象。

      【讨论】:

      • 这是一个很好的建议 StarShip3000。我决定使用 django-admin.py syncdb 实际重建表。这让我可以在我的开发机器上测试 PostreSQL。我确实有一个运行 mySQL 的实时站点 dzinebox。在某些时候,我将不得不进行数据迁移,并会记住您的建议。
      猜你喜欢
      • 2018-08-05
      • 2016-01-10
      • 2021-09-07
      • 2020-06-22
      • 1970-01-01
      • 2023-03-22
      • 2022-01-14
      • 2015-10-27
      • 1970-01-01
      相关资源
      最近更新 更多