문제

나는 기본적으로 주위를 가지고 놀기 위해 몇 개의 테이블을 만들었습니다. 나는 두 개의 메인 테이블과 많은 마니 가입 테이블이 있습니다. 다음은 DDL입니다. (저는 HSQLDB를 사용하고 있습니다)

CREATE TABLE PERSON
(
    PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50), MAIN_PERSON_ID INTEGER
)

CREATE TABLE JOB
(
    JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)
CREATE TABLE JOB_PERSON
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER
)
ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE JOB_PERSON ADD
    CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID) 
    REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE

ALTER TABLE PERSON ADD
    CONSTRAINT FK_PERSON_PERSON FOREIGN KEY(MAIN_PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE

insert into person values(null,'Arthur', null);
insert into person values(null,'James',0);
insert into job values(null, 'Programmer')
insert into job values(null, 'Manager')
insert into job_person values(0,0);
insert into job_person values(0,1);
insert into job_person values(1,1);

Person.person_id를 기준으로 Job에서 고아를 삭제하는 삭제 명령문 (특정 작업에 대한 조인 테이블에 하나의 항목 만 존재하는 경우)을 작성하고 싶습니다.

의사 언어로 :

delete from job where job_person.job_id=job.job_id 
AND count(job_person.job_id)=1 AND job_person.person_id=X

여기서 x는 person_id입니다. 나는 많은 다른 방법을 시도했다. 나는 그것이 문제를 일으키는 "수"부분이라고 생각합니다. 나는 SQL 신인이므로 모든 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

나는 팔로우하지 않습니다.

삭제할 수 없습니다 JOB 가지고있는 줄 JOB_PERSON FK 금액으로 인해 행 (하나). 따라서 삭제할 방법이 없습니다 JOB 기반의 행 PERSON 줄.

JOB_PERSON a 전에 행을 삭제해야합니다 JOB 또는 PERSON 삭제할 수 있습니다.

모든 것을 삭제하려면 JOB NO가있는 줄 JOB_PERSON, 그런 다음 한 가지 방법은 다음과 같습니다.

DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)

모든 것을 삭제하려면 JOB_PERSON 특정 사람과 모든 고아를위한 줄은 두 단계로 수행합니다.

DELETE FROM JOB_PERSON
WHERE PERSON_ID = X

DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)

고아 만 삭제하려면 JOBs 이전에 x에 연결된 경우, 첫 번째 삭제 전에 임시 테이블에 보관해야합니다.

INSERT INTO TEMP_TABLE
SELECT JOB.JOB_ID
FROM JOB
INNER JOIN JOB_PERSON
    ON JOB_PERSON.JOB_ID = JOB.JOB_ID
WHERE JOB_PERSON.PERSON_ID = X

DELETE FROM PERSON
WHERE PERSON_ID = X

-- YOUR CASCADING DELETE DOES THIS:
/*
DELETE FROM JOB_PERSON
WHERE PERSON_ID = X
*/

-- Now clean up (only) new orphans on the other side
DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)
AND JOB_ID IN (
    SELECT JOB_ID
    FROM TEMP_TABLE
)

다른 팁

이것은 job_person (Orpheans)에 항목이없는 테이블 작업 항목에서 삭제됩니다.

DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)

다른 테이블에서 외국으로 연결된 행을 삭제할 수 없습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top