2017-11-24 15 views
0

테이블 구조를 추가 -는 드롭 대 열을 수정하고 열 MySQL의

| Field   | Type   | Null | Key | Default | Extra   | 
+----------------+--------------+------+-----+---------+----------------+ 
| id    | bigint(20) | NO | PRI | NULL | auto_increment | 
| candidateId | bigint(20) | NO |  | NULL |    | 
| profileId  | bigint(20) | NO | MUL | NULL |    | 
| clientId  | bigint(20) | NO |  | NULL |    | 
| email   | varchar(128) | NO |  | NULL |    | 
| verified  | tinyint(1) | YES |  | 0  |    | 
| isPrimary  | tinyint(1) | YES |  | 0  |    | 
| createdOn  | datetime  | NO |  | NULL |    | 
| createdBy  | bigint(20) | NO |  | NULL |    | 
| encryptedEmail | varchar(255) | NO |  | NULL |    | 
+----------------+--------------+------+-----+---------+--------- 

는 현재 encryptedemail에 데이터가 없습니다.

내가 고유 키를 만들고 싶었 -

(clientId, profileId, encryptedEmail)

그래서 나는

clientId and profileId were duplicate. 

쿼리 내가 사용 기록이 있었다으로 null을 기본 암호화 된 이메일을 변환 시도 -

ALTER TABLE AlternateEmails MODIFY encryptedEmail varchar(255) NULL, 
add constraint `profileId_3` 
unique(`encryptedEmail`,`clientId`,`profileId`); 

여전히 중복 레코드 오류가 표시됩니다.

은 그럼 내가 사용 -

alter table AlternateEmails drop column encryptedEmail, 
add column encryptedEmail varchar(255) default NULL, add constraint 
`profileId_3` unique(`encryptedEmail`,`clientId`,`profileId`); 

그것은 괜찮 았는데. 누군가 열 수정이 왜 효과가 없었던 지 설명 할 수 있습니까?

+0

데이터 및 테이블 구조를 보지 않고도 아무 말도하기 어렵습니다. – Susang

+0

테이블 구조가 이미 언급되었습니다. –

+0

'열 수정'과 '제약 추가'를 별도로 시도해 주실 수 있습니까? – Susang

답변

0

기존 필드의 기본값을 변경하고 해당 새 기본값을 사용하여 필드를 추가하는 경우에는 뚜렷한 차이가 있습니다. 기존 필드의 기본값을 변경하면 이 아닌 기존 데이터 수정 그것은 이전 기본값을 가졌습니다.

앞으로 새로운 기본값이 적용됩니다.

alter table 문에서 MySQL의 설명서에 설명되어 있습니다 :

전용 테이블 메타 데이터 서버는 테이블의 .frm 파일을 변경해야하기 때문에 테이블 데이터가 에게, 즉시 만지지되어 있지 테이블을 수정 수선 내용. 다음과 같은 변경이 방식으로 만들어집니다 :

◾ ... 열의 기본값을 변경

(NDB 테이블 제외). encryptedEmail 필드의 기본 값이 null가 아닌 경우

...

그래서, 그것은 기본 값으로 빈 문자열 (또는 다른 어떤 지정한)을 가지고 모든 기존 기록은 채워했다 이 기본값. 기본값을 null로 변경해도 기존 레코드에는 영향을주지 않으므로 encryptedEmail 필드 값은 서로 중복됩니다.

그러나 null을 기본값으로 사용하여 encryptedEmail 필드를 삭제하고 다시 만들 때 MySQL은 기존 레코드를 MySQL에서 중복 값으로 간주하지 않는 null 값으로 채 웁니다.

+0

답변에 만족합니다. 감사 ! –