代码之家  ›  专栏  ›  技术社区  ›  William

无法解释此错误:没有与引用表的给定键匹配的唯一约束

  •  1
  • William  · 技术社区  · 6 年前


    一般来说,我对Postgres和SQL非常陌生。我正在完成一个家庭作业任务,在将ERD导出为SQL并在Postgres中运行之前,我们必须获取包含数据的6x.csv文件,并将它们作为ERD形式的表进行概念化。

    我的SQL脚本-

    CREATE TABLE "titles" (
        "title_id" VARCHAR   NOT NULL,
        "title" VARCHAR   NOT NULL
    );
    
    -- Employees Table
    CREATE TABLE "employees" (
        "emp_no" INT   NOT NULL,
        "emp_title_id" INT   NOT NULL,
        "birth_date" DATE   NOT NULL,
        "first_name" VARCHAR   NOT NULL,
        "last_name" VARCHAR   NOT NULL,
        "sex" INT   NOT NULL,
        "hire_date" DATE   NOT NULL,
        CONSTRAINT "pk_employees" PRIMARY KEY (
            "emp_no"
         )
    );
    
    -- Salaries Table
    CREATE TABLE "salaries" (
        "emp_no" INT   NOT NULL,
        "salary" INT   NOT NULL
    );
    
    -- Department Manager
    CREATE TABLE "dept_manager" (
        "dept_no" VARCHAR   NOT NULL,
        "emp_no" INT   NOT NULL
    );
    
    -- Department Numbers
    CREATE TABLE "departments" (
        "dept_no" VARCHAR   NOT NULL,
        "dept_name" VARCHAR   NOT NULL,
        CONSTRAINT "pk_departments" PRIMARY KEY (
            "dept_no"
         )
    );
    
    -- Employee vs. Department
    CREATE TABLE "dept_emp" (
        "emp_no" INT   NOT NULL,
        "dept_no" VARCHAR   NOT NULL
    );
    
    ALTER TABLE "employees" ADD CONSTRAINT "fk_employees_emp_title_id" FOREIGN KEY("emp_title_id")
    REFERENCES "titles" ("title_id");
    
    ALTER TABLE "salaries" ADD CONSTRAINT "fk_salaries_emp_no" FOREIGN KEY("emp_no")
    REFERENCES "employees" ("emp_no");
    
    ALTER TABLE "dept_manager" ADD CONSTRAINT "fk_dept_manager_dept_no" FOREIGN KEY("dept_no")
    REFERENCES "departments" ("dept_no");
    
    ALTER TABLE "dept_manager" ADD CONSTRAINT "fk_dept_manager_emp_no" FOREIGN KEY("emp_no")
    REFERENCES "employees" ("emp_no");
    
    ALTER TABLE "dept_emp" ADD CONSTRAINT "fk_dept_emp_emp_no" FOREIGN KEY("emp_no")
    REFERENCES "employees" ("emp_no");
    
    ALTER TABLE "dept_emp" ADD CONSTRAINT "fk_dept_emp_dept_no" FOREIGN KEY("dept_no")
    REFERENCES "departments" ("dept_no");
    

    发行

    ALTER TABLE "employees" ADD CONSTRAINT "fk_employees_emp_title_id" FOREIGN KEY("emp_title_id")
    REFERENCES "titles" ("title_id");
    

    “我收到错误信息 错误:存在没有与引用表“titles”的给定键匹配的唯一约束SQL state:42830

    我的想法-
    …是不是标题表中外键的名称不匹配( title_id )它是employees表中的主键( emp_title_id )导致了这个问题。两者 标题id emp_title_id公司 包含相同的值(即雇员id,例如s002)。

    2 回复  |  直到 6 年前
        1
  •  1
  •   GMB    6 年前

    错误消息试图告诉您。外键只能引用 unique ,或 primary key . 但是你的外键的目标, titles(title_id) ,无法满足此要求。

    所以基本上你需要申报 title_id 作为 titles

    您还需要在列之间对齐数据类型(这是外键的另一个要求):从现在开始, 标题(标题id) 声明为字符串,而引用列为 INT . 据推测,源列应该是 国际的 我也是。

    CREATE TABLE titles (
        title_id int   NOT NULL,
        title VARCHAR   NOT NULL,
        CONSTRAINT pk_titles PRIMARY KEY (title_id)
    );
    

    有了这个修复,你的整个代码运行良好 in this DB Fiddle

    不相关的注意事项:你应该避免重复引用所有的标识符;这样做没有帮助,而且以后可能会使事情更复杂。

        2
  •  0
  •   The Impaler    6 年前

    在桌子上 "titles" 你忘了定义主键。因此,不能针对该表创建外键。

    要解决此问题,表定义应如下所示:

    CREATE TABLE "titles" (
        "title_id" VARCHAR   NOT NULL,
        "title" VARCHAR   NOT NULL,
        CONSTRAINT "pk_titles" PRIMARY KEY (
            "title_id"
         )
    );