2011-08-20 5 views
3

MySQL은 외래 키가있는 다중 열 고유 제약 조건과 관련하여 일종의 문제가있는 것처럼 보입니다. 여기에 내가이 (사용 MySQL은/​​이노)를 보여 가지고 올 수있는 가장 작은 예입니다 :MySQL에서 ForeignKey 필드와 관련된 unique_together 제약 조건을 어떻게 가질 수 있습니까?

:

models.py

from django.db import models 

class Team(models.Model): 
    pass 

class Player(models.Model): 
    team = models.ForeignKey(Team) 
    number = models.PositiveIntegerField() 

    class Meta: 
     unique_together = ("team", "number") 

schemamigration --initial 실행, 남쪽으로는 다음과 같은 마이그레이션 (만 중요한 비트)를 뱉어

class Migration(SchemaMigration):                                     
    def forwards(self, orm): 
     # Adding model 'Team' 
     db.create_table('fkuniq_team', (
      ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 
     )) 
     db.send_create_signal('fkuniq', ['Team']) 

     # Adding model 'Player' 
     db.create_table('fkuniq_player', (
      ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 
      ('team', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['fkuniq.Team'])), 
      ('number', self.gf('django.db.models.fields.PositiveIntegerField')()), 
     )) 
     db.send_create_signal('fkuniq', ['Player']) 

     # Adding unique constraint on 'Player', fields ['team', 'number'] 
     db.create_unique('fkuniq_player', ['team_id', 'number']) 

와 MySQL에서 :

mysql> SHOW COLUMNS FROM fkuniq_player; 
+---------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+------------------+------+-----+---------+----------------+ 
| id  | int(11)   | NO | PRI | NULL | auto_increment | 
| team_id | int(11)   | NO | MUL | NULL |    | 
| number | int(10) unsigned | NO |  | NULL |    | 
+---------+------------------+------+-----+---------+----------------+ 

나는 조용히 남쪽 생각 내가 원한 고유 한 제약 조건을 만들지 못했습니다. Key 열에서 나는 id에 기본 키 인덱스 및 team_id에 외래 키 인덱스를 볼 수 있지만 team_id로에 UNIQUE 인덱스가 있어야하기 때문에 또한 number 행의 MUL이 있어야합니다. 또한, 모델에서 unique_together 제약 조건을 제거하는 것은 오류와 함께 실패 할 다음 마이그레이션을 발생합니다

Traceback (most recent call last): 
    ... 
    File "/home/aogier/uniques/../uniques/fkuniq/migrations/0002_auto__del_unique_player_number_team.py", line 12, in forwards 
    db.delete_unique('fkuniq_player', ['number', 'team_id']) 
    File "/home/aogier/.virtualenvs/uniques/lib/python2.7/site-packages/south/db/generic.py", line 479, in delete_unique 
    raise ValueError("Cannot find a UNIQUE constraint on table %s, columns %r" % (table_name, columns)) 
ValueError: Cannot find a UNIQUE constraint on table fkuniq_player, columns ['number', 'team_id'] 

내가 외래 키 제약 조건 및 다중 열이 UNIQUE 제약 조건이 일치 할 때 MySQL이 잘 작동하지 않기 때문에이없는 생각합니다. 그 효과에 대한 설명은 ALTER TABLE에 대한 MySQL 설명서에서 확인하실 수 있습니다 : http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (약 절반 아래로보기, Hadi Rastgou의 코멘트).

어쨌든 오랜 질문을 드려 죄송합니다. 누구든지이 작업을 수행 할 수있는 방법이 있습니까? 원시 SQL에서 MySQL 관련 쿼리를 작성해야하는 경우에도 마이 그 레이션 내에서이를 수행하는 깔끔한 방법을 좋아합니다. 아니면 MySQL에서 불가능한 일일 수도 있습니다.이 작업에 더 많은 시간을 할애하기 전에 알아두면 좋을 것입니다.

답변

관련 문제