【问题标题】:Postgres - unique constraintPostgres - 唯一约束
【发布时间】:2015-03-06 02:47:56
【问题描述】:

当我尝试创建第二个表时,我遇到了以下错误,但我不知道为什么。 对于表专利,我希望能够将 (idfuncionario, titulo) 作为主键。 我已经尝试按照其他主题中的建议将 UNIQUE 约束设置为“UNIQUE (idfuncionario, titulo)。

CREATE TABLE publicacao
(
idfuncionario CHAR(5) NOT NULL,
titulo        VARCHAR(50) NOT NULL,
data          TIMESTAMP NOT NULL,
PRIMARY KEY (idfuncionario, titulo),
FOREIGN KEY(idfuncionario) REFERENCES trabalha(idfuncionario)
);

CREATE TABLE patente
(
idfuncionario CHAR(5) NOT NULL,
titulo        VARCHAR(50) NOT NULL,
datafim       TIMESTAMP NOT NULL,
descricao     VARCHAR(100) NOT NULL,
PRIMARY KEY (idfuncionario, titulo),
FOREIGN KEY(idfuncionario) REFERENCES trabalha(idfuncionario),
FOREIGN KEY(titulo) REFERENCES publicacao(titulo)
);

消息错误:

错误:没有唯一约束匹配引用表“publicacao”的给定键 SQL 状态:42830

我在 Windows 8.1 64 位上使用 Postgres 9.4

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    引用publicacao 的外键必须引用该表的主键。所以在创建patente时要做到以下几点:

    CREATE TABLE patente
    (
      idfuncionario CHAR(5) NOT NULL,
      titulo        VARCHAR(50) NOT NULL,
      datafim       TIMESTAMP NOT NULL,
      descricao     VARCHAR(100) NOT NULL,
      PRIMARY KEY (idfuncionario, titulo),
      FOREIGN KEY (idfuncionario) REFERENCES trabalha (idfuncionario),
      FOREIGN KEY (idfunctionario, titulo) REFERENCES publicacao (idfuncionario,titulo)
    );
    

    我认为idfunctionario 上的外键在这种情况下是多余的。

    另一方面,也许当您创建 publicacao 时,您打算让它的主键只包含 titulo 列?

    【讨论】:

    • 我无法使用您的提示解决。 PK 更改的标题现在可以使用,但稍后我可能会遇到一些功能问题。我在设计层面做了一些改变,所以现在工作顺利。但我真的很感谢你的帮助。谢谢你,祝你有美好的一天。
    • Alessandro,如果我的回答没有帮助,我很抱歉。基本问题是外键必须引用父表的唯一索引(最好是主键)——这就是保持参照完整性的方式。
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多