2016-07-15 6 views
2

잘 검색했지만 문제를 잘 설명하는 대답을 찾을 수 없습니다. 다음은 간단한 문제 예제입니다. 테이블 testfirstsecond의 두 필드가 있다고 가정 해 봅시다. 나는 first을 기본 키로 만들고 second을 참조하여 first을 참조하고 업데이트를 캐스케이드합니다. 이렇게하면 'head'가 아닌 한 주어진 행 다음에 오는 행을 알면서 행 목록을 만들 수 있습니다.외래 키 동일한 테이블 참조

테이블을 만들면 문제가 없지만 행을 추가하려고하면 계단식 업데이트로 외래 키 제약 조건이 실패했다고 불평합니다. 이것은 내가 second을 null로 남겨 두었던 것처럼 의미가 있습니다. 따라서, 나는 두 행을 삽입 한 후 외부 키를 추가 할 수 있다고 생각 :

  1. first: a second: b
  2. first: b second: a

이 성공적이었다. 그런 다음 행 1을 업데이트하여 first 값이 c이되도록했습니다. 그러나 이것은 작동하지 않았으며 외래 키가 실패했다는 것을 나타냅니다. 왜? 다음과 같이되어야하지 않습니까?

  1. first: c second: b
  2. first: b second: c

내 유일한 직감 1 행 다시 계단식, 2 행 1 계단식 업데이트 행에 원형 업데이트의 존재를하지만, 이런 일이 안됩니다! 업데이트는 second을 참조하는 것이 없으므로 업데이트는 2 행으로 캐스케이드하고 중지되어야합니다. 제발 도와 줘요,이게 제 정신이 아니에요.

편집 : 요청한대로 여기 내 show create table test입니다.

CREATE TABLE `test` (
`first` varchar(32) NOT NULL, 
`second` varchar(32) NOT NULL, 
PRIMARY KEY (`first`), 
KEY `fk` (`second`), 
CONSTRAINT `fk` FOREIGN KEY (`second`) REFERENCES `test` (`first`) ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

답변

0

내가 문제를 생각 컬럼의 구조에 있습니다

  • 기본 키는
  • 하고 참조하는 열이 null 값을 허용했다가, (허용되지 null 일 수 없습니다 참조 된 열은 아니다 null)

따라서 동일한 데이터 유형, 동일한 charset 및 null이 아닌 두 가지 열이 모두 있는지 확인하십시오.

업데이트 : 문제는 외래 키와 참조 키가 동일한 테이블에 있고 다른 테이블로 테스트 한 결과입니다.

+0

기본 키는 1 행에는 c, 2 행에는 b가 될 것이므로 null이 아닙니다. 또한 참조하는 열에도 null 값이 없습니다. 1 행은 b이고 2 행은 c입니다. –

+1

null 값은 없지만? 구조를보기 위해서'show create table test '를 붙여 주시겠습니까? 감사합니다 –

+0

확실히, 결과와 함께 내 질문을 편집했습니다. –