[英]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.