如何删除具有包含重复值的特定列的行,其中每个行都有约束?

时间:2016-05-23 11:10:00

标签: sql postgresql foreign-keys constraints

尝试delete duplicates时:

DELETE FROM staff
WHERE staff_id NOT IN (SELECT MIN(staff_id) FROM staff GROUP BY store_id);

有一个错误:

  

[23503]错误:更新或删除表“staff”违反外键   表“付款”上的约束“payment_staff_id_fkey”详细信息:密钥   (staff_id)=(3)仍然从表“付款”中引用。

确实,付款有FK约束:

CREATE TABLE public.payment
(
  payment_id integer NOT NULL DEFAULT nextval('payment_payment_id_seq'::regclass),
  customer_id integer NOT NULL,
  staff_id smallint NOT NULL,
  rental_id integer NOT NULL,
  amount numeric(5,2) NOT NULL,
  payment_date timestamp without time zone NOT NULL,
  CONSTRAINT payment_pkey PRIMARY KEY (payment_id),
  CONSTRAINT payment_customer_id_fkey FOREIGN KEY (customer_id)
      REFERENCES public.customer (customer_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT payment_rental_id_fkey FOREIGN KEY (rental_id)
      REFERENCES public.rental (rental_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE SET NULL,
  CONSTRAINT payment_staff_id_fkey FOREIGN KEY (staff_id)
      REFERENCES public.staff (staff_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT
)
WITH (
  OIDS=FALSE
);

由于payment.staff_id = nullsuggested here,因此无法设置NOT NULL

解决这个问题的最简单方法是什么?

1 个答案:

答案 0 :(得分:3)

看起来它是数据模型的问题,而不是数据库。

此时约束严格禁止您执行此类删除。看起来有一个严格的规则" 每个付款都必须与使用它的工作人员联系,付款信息应保留在db "中。因此,如果需要删除工作人员记录,则必须更改该规则。以下是一些选项:

  • 每笔付款都必须与使用该付款的工作人员相关联,并且付款信息应保留在db 中。在这种情况下,您只需要使staff_id可以为空并将约束更改为ON DELETE SET NULL
  • 每笔付款都必须与工作的员工联系 使用它和付款信息不一定应保留在db 中。如果要删除已删除工作人员处理的付款,请将“删除限制”更改为“删除CASCADE”
  • 每笔付款都必须与工作的员工联系 使用或另一个,付款信息应保留在db 中。可以将付款重新引用给另一名工作人员,例如组织负责人。在这种情况下,您应该将约束更改为ON DELETE SET DEFAULT(并设置默认值ofc)。
  • 还有一个选项是通过将public.staff中的记录标记为存档而不是删除来保留工作人员成员ID。如果是这样,你需要一种方法:public.staff中的一些bool列或类似的东西。

无论如何,它首先是业务逻辑问题,而不是技术问题。

编辑:问题已被更改或我错过了注释"当尝试删除重复项时#34;。如果是这样,你只需要更新与stuff成员链接的实体,在删除之前将它们取消引用它们而不是重复。