繁体   English   中英

SQL 查询返回“无唯一约束”但表显示唯一约束

[英]SQL query returns 'no unique constraint' but table DOES show unique constraint

我正在尝试在 SQL 中创建志愿者和客户之间的连接表:

CREATE TABLE IF NOT EXISTS public.volunteer_client
(
  id serial PRIMARY KEY,
  volunteer_id integer NOT NULL,
  client_id integer NOT NULL,
  created_by text,
  created_at timestamp NOT NULL DEFAULT now(),
  updated_by text,
  updated_at timestamp NOT NULL DEFAULT now(),
  CONSTRAINT fk_volunteer_client_volunteer FOREIGN KEY (volunteer_id)
      REFERENCES public.provider_user (user_id) MATCH SIMPLE
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
  CONSTRAINT fk_volunteer_client_client FOREIGN KEY (client_id)
      REFERENCES public.provider_client (user_id) MATCH SIMPLE
      ON UPDATE CASCADE
      ON DELETE RESTRICT
);

ALTER TABLE public.volunteer_client OWNER to navigate;

我目前收到的错误:

ERROR:  there is no unique constraint matching given keys for referenced table "provider_user"
SQL state: 42830

尽管在我的 provider_user 表中,user_id 似乎确实具有唯一的约束:

CREATE TABLE IF NOT EXISTS public.provider_user
(
  id serial PRIMARY KEY,
  provider_id integer NOT NULL,
  user_id integer NOT NULL,
  user_type_id integer NOT NULL,
  created_by text,
  created_at timestamp NOT NULL DEFAULT now(),
  updated_by text,
  updated_at timestamp NOT NULL DEFAULT now(),
  UNIQUE(user_id, provider_id, user_type_id),
  CONSTRAINT fk_provider_users_provider FOREIGN KEY (provider_id)
      REFERENCES public.provider (id) MATCH SIMPLE
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
  CONSTRAINT fk_provider_users_user FOREIGN KEY (user_id)
      REFERENCES public.user (id) MATCH SIMPLE
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
  CONSTRAINT fk_provider_user_type FOREIGN KEY (user_type_id)
      REFERENCES public.provider_user_type (id) MATCH SIMPLE
      ON UPDATE CASCADE
      ON DELETE RESTRICT
);

任何帮助将不胜感激!

更新:

CREATE TABLE IF NOT EXISTS public.volunteer_client
(
  id serial PRIMARY KEY,
  volunteer_id integer NOT NULL,
  client_id integer NOT NULL,
  created_by text,
  created_at timestamp NOT NULL DEFAULT now(),
  updated_by text,
  updated_at timestamp NOT NULL DEFAULT now(),
--   UNIQUE(volunteer_id, client_id),
  CONSTRAINT fk_volunteer_client_volunteer FOREIGN KEY (volunteer_id)
      REFERENCES public.user (id) MATCH SIMPLE
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
  CONSTRAINT fk_volunteer_client_client FOREIGN KEY (client_id)
      REFERENCES public.user (id) MATCH SIMPLE
      ON UPDATE CASCADE
      ON DELETE RESTRICT
);

ALTER TABLE public.volunteer_client OWNER to navigate;

志愿者ID 和客户端 ID FKS都引用了用户表上的 PK

首先,您在(user_id, provider_id, user_type_id)上有一个复合唯一键,因此不能保证 user_id 本身是唯一的,但是这 3 列的组合是。

其次,您在 provide_user 中的主键是列id ,最佳做法是对 PK 进行 FK,而不是对唯一列

因此,与其将志愿者 ID 从 provider_user 链接到 user_id,不如将其链接到 id 列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM