2014-01-31 1 views
1

위반 중복 I 다음 표했다 : models.py에Postrgersql + 장고 : NULL 값이 IntegrityError가 발생합니다 키 값이 고유 제한 조건

Column  |   Type    |       Modifiers       
----------------+-----------------------------+--------------------------------------------------------------- 
user_id   | bigint      | not null default nextval('employee_user_id_seq'::regclass) 
name   | character varying(50)  | not null              
phonenumber  | character varying(20)  | not null              
phonenumber2 | character varying(20)  |                
email   | character varying(75)  |  
Indexes: 
"employee_pkey" PRIMARY KEY, btree (user_id) 
"employee_email_key" UNIQUE CONSTRAINT, btree (email) 
"employee_phonenumber2_key" UNIQUE CONSTRAINT, btree (phonenumber2) 
"employee_phonenumber_email_key" UNIQUE CONSTRAINT, btree (phonenumber, email) 
"employee_phonenumber_key" UNIQUE CONSTRAINT, btree (phonenumber)               

:

class Employee(models.Model): 
    user_id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=50) 
    phonenumber = models.CharField(max_length=20, unique=True) 
    phonenumber2 = models.CharField(max_length=20, unique=True) 
    email = models.EmailField(blank=True, unique=True) 

장고를 사용하여 내가 삽입 한 테이블에 phonenumber2가없는 직원. 그 첫 번째 NULL 두 번째 시도에서 다음의 원인은 부드러운 간다 처음 내가 오류 얻을 : 내 이해 NULL에서

IntegrityError: duplicate key value violates unique constraint "employee_phonenumber2_key" 
DETAIL: Key (phonenumber2)=() already exists. 

가 제약의 값으로 간주되어서는 안됩니다을, 내가 달성하기 위해 노력하고있어 것은 동일한 전화 번호 또는 전화 번호와 이메일의 조합을 다른 직원에게 복제 할 수 없습니다.

어떻게 해결할 수 있습니까?

+0

"models.py" 야생 추측으로 장고를 사용하고 있습니까? (언급하는 것이 좋으며, 적어도 태그를 붙이는 것). –

+0

@CraigRinger 감사합니다. 질문을 편집했습니다. –

답변

2

실제로는 NULL을 삽입하지 않았습니다. 빈 문자열 ''이 삽입됩니다. NULL을 삽입하는 경우 표시되는 오류를 가져올 수 없습니다. 고유 제한 조건을 사용하여 NULL을 무시하려면 실제로 NULL을 사용해야합니다.

PostgreSQL 서버 오류 로그를 검사하면 실행 된 쿼리가 표시됩니다. 당신은 모든 세부 사항을 얻으려면 log_statement = all을 켜야 할 수도 있습니다. 귀하가 INSERT'' (phonenumber2)이 아니라 NULL으로 표시했다는 것을 보여줍니다.

은 결정적으로이 문제를 설명하기 위해 :

ALTER TABLE employee ADD CONSTRAINT phonenumber2_nonempty 
CHECK (phonenumber2 IS NULL OR length(phonenumber2) > 0); 

는 길이가 0 인 문자열이있는 모든 행을 거부 할 수 있습니다. 이미 추가 한 것을 포함하여 null이라고 생각 했으므로, 점검 제한 조건을 추가하는 것은 실패합니다.

"models.py"에 대한 언급으로 Django를 사용하는 것처럼 보입니다. Django는 Python 값 None이 이 아닌 ''으로 문자 필드에 저장되어야한다는 IMO의 잘못된 생각을 가지고 있습니다. ''None을 모두 "빈 값"으로 취급합니다. You can tell it to store None as NULL with Field.null. 그렇다면 ''을 강제로 NULL으로 저장할지 확실하지 않습니다. 나는 희망하지 않지만 시험하지는 않았습니다.

+0

@liva 조금만 들여다 보아도 이해할 수없는 경우 새로운 질문을 제안하십시오. 나는 장고를 사용하지 않는다. –

관련 문제