2013-12-11 2 views
0

내 목표는 모든 데이터에 대한 최종 업데이트 시간을 얻는 것입니다.업데이트 캐스케이드의 MySQL이 부모를 업데이트하지 않습니다. FK

세부 사항 : - 그룹

groupId 
groupName 
timeUpdated (timestamp - on update) 

그리고 다른 테이블 - 나는 테이블이있는 사용자를

userId 
timeUpdated (timestamp - on update) 
groupId (FK to Groups) 
ADD CONSTRAINT `users_ibfk_3` FOREIGN KEY (`groupId`) REFERENCES `groups` (`groupId`) ON DELETE CASCADE ON UPDATE CASCADE, 

나는 내 상대 그룹의 행이 새로운 업데이트받을하려는 사용자 테이블을 업데이트 할 때 타임 스탬프.

나는/무엇을 내가 잘못하고있는 중이은 불행하게도

어떤 아이디어가 작동하지 않는 것, 일을해야한다고 생각?

덕분에, 오므리

+0

그런 식으로 작동하지 않습니다. FK가 참조하고있는 PK를 변경하면, FK 값은'CASCADE' 옵션으로 업데이트됩니다 ... 다른 방법은 아닙니다. –

+0

좋습니다. 감사합니다. 스마트하게 할 수 있습니까? – omri

+0

일반적으로 레코드의 PK를 변경하는 경우 디자인 문제가 발생합니다. 시도하는 방식보다는 자신이하려는 일에 대한 질문을 업데이트하십시오. 누군가가 당신을보다 효율적으로 도울 수 있어야합니다. –

답변

0

는 두 가지 방법으로 Groups 테이블에 timeUpdated 열을 사용하기 위해 노력하고 있습니다. 이것은 아마도 당신이하고 싶은 것이 아닙니다.

는 대신, Groups 테이블이 Groups 테이블에 대한 변경 사항에 대한 업데이트 타임 스탬프 및 Users 테이블에 대한 최신 업데이트를 기록 Users 테이블을 유지 할 수 있습니다. 당신은 정말 멋진 받기를 원한다면, 당신은 같은 것을 할 수

select 
    g.groupid, 
    g.groupname, 
    g.timeupdated as grouplastchanged, 
    max(u.timeupdated) as lastuserchanged 
from 
    groups as g 
inner join 
    users as u 
    on u.groupId = g.groupId 
group by 
    g.groupid, 
    g.groupname, 
    g.timeupdated; 

을 또는 : 당신이 어떤 회원 정보가 그룹 테이블에서 변경 마지막으로 찾을 때

, 당신과 같이 조회 할 수 있습니다 :

select 
    g.groupid, 
    g.groupname, 
    greatest(g.timeupdated, max(u.timeupdated)) as lastmodified 
from 
    groups as g 
inner join 
    users as u 
    on u.groupId = g.groupId 
group by 
    g.groupid, 
    g.groupname; 

사용자 및 그룹의 무리를 기대하고 있다면, 나는 Users 테이블의 groupid 열을 인덱싱하는 것이 좋습니다.

관련 문제