2015-11-06 117 views
0

我无法从PostGres DB的父表中删除记录..你们中的任何一个人都可以让我对此有所了解。级联删除不起作用

-- Table: tbl_patient 

-- DROP TABLE tbl_patient; 

CREATE TABLE tbl_patient 
(
patient_id bigserial NOT NULL, 
date_of_birth date NOT NULL, 
fathers_name character varying(255) NOT NULL, 
first_name character varying(255) NOT NULL, 
last_name character varying(255), 
marital_status character varying(255), 
mobile_number character varying(255) NOT NULL, 
occupation character varying(255), 
phone_number character varying(255), 
pregnancy_status character varying(255), 
sex character varying(255) NOT NULL, 
CONSTRAINT tbl_patient_pkey PRIMARY KEY (patient_id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE tbl_patient 
OWNER TO postgres; 


-- Table: tbl_address 

CREATE TABLE tbl_address 
(
address_id bigserial NOT NULL, 
address_line_1 character varying(255) NOT NULL, 
address_line_2 character varying(255), 
city character varying(255), 
country character varying(255), 
district character varying(255) NOT NULL, 
pincode character varying(255) NOT NULL, 
state character varying(255), 
street character varying(255), 
patient_id bigint, 
CONSTRAINT tbl_address_pkey PRIMARY KEY (address_id), 
CONSTRAINT fk_slc6pgeimmox5buka8bydy6c4 FOREIGN KEY (patient_id) 
    REFERENCES tbl_patient (patient_id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE tbl_address 
    OWNER TO postgres; 

// ----------------------------------------- --------------------------

当我把这个命令

DELETE FROM tbl_patient 
    WHERE patient_id = 1; 

我下面

此错误

ERROR: update or delete on table "tbl_patient" violates foreign key constraint "fk_slc6pgeimmox5buka8bydy6c4" on table "tbl_address" SQL state: 23503 Detail: Key (patient_id)=(1) is still referenced from table "tbl_address".

+0

您的代码没有问题。它工作得很好。即使在'tbl_patient'表中添加了一行之后,它也会被删除。在其他地方寻找问题。如果可能的话,创建一个新的数据库并在那里尝试。你会看到它的作品。 – mehmet

+1

你在哪里“放这个命令”?以及它与JPA API有什么关系? –

回答

1

你写DELETE NO ACTION,你想要的行动:)只需要更改为

REFERENCES tbl_patient (patient_id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE CASCADE 

NO ACTION表示服务器如果存在引用的行,则不会执行任何操作。由于它们存在,并且您还指定MATCH SIMPLE为单列外键,因此PostgreSQL无法执行删除操作,因为引用了这些行。