Два первичных ключа указаны в базе данных MySQL - PullRequest
6 голосов
/ 20 июля 2011

Я пытаюсь создать тестовую базу данных, которая является копией существующей базы данных. Я использую модели Django (теоретически модели, используемые с исходной базой данных), чтобы сделать это. Недавно я унаследовал код от кого-то другого и пытаюсь выяснить, что именно происходит с кодом.

В модели одна из таблиц имеет два столбца, идентифицированных как первичный ключ.

        column1 = models.IntegerField(primary_key = True)
        column2 = models.IntegerField(primary_key = True)
        column3 = models.CharField(max_length = 30)

Когда я пытаюсь синхронизировать эту модель с тестовой базой данных, возникает ошибка:

Файл "/somePathHere/MySQLdb/connections.py", строка 36, в defaulterrorhandler повышать errorclass, errorvalue _mysql_exceptions.OperationalError: (1068, «Определено несколько первичных ключей»)

В документах django написано, что Django не допускает использование нескольких первичных ключей. Однако, глядя на вывод DESCRIBE [tablename] в исходной базе данных MySQL, кажется, что это именно то, что здесь происходит:

        +------------+------------+------+-----+---------+-------+
        | Field      | Type       | Null | Key | Default | Extra |
        +------------+------------+------+-----+---------+-------+
        | IDENTIFIER | bigint(20) | NO   | PRI | NULL    |       |
        | TIMESTAMP_ | bigint(20) | NO   | PRI | NULL    |       |
        | VALUE_     | longtext   | YES  |     | NULL    |       |
        +------------+------------+------+-----+---------+-------+

Обратите внимание, что и IDENTIFIER, и TIMESTAMP_ указаны в качестве первичных ключей.

Я вижу много тем по SO ( Пример 1 , Пример 2 и Пример 3 ) о создании первичного ключа на основе нескольких столбцы - это то, что я вижу составной ключ? В каком случае, как это передается через модель Django, то есть, как можно повторить это?

Если это не составной ключ, что это?

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Это не поддерживается в Django, но есть обходной путь. В вашей модели укажите unique_together и поля в разделе Meta:

class MyClass(models.Model):
    IDENTIFIER = models.IntegerField(blank=False,null=False)
    TIMESTAMP_ = models.IntegerField(blank=False,null=False)
    VALUE_ = models.TextField(blank=True, null=True)

    class Meta:
        unique_together = ('IDENTIFIER', 'TIMESTAMP_')

Это сохранит поведение первичного ключа из двух столбцов.

3 голосов
/ 20 июля 2011

Django в настоящее время не поддерживает многоколонные первичные ключи , хотя существуют патчи / вилки, которые расширяют его для этого (с разной степенью полировки). Из FAQ «Поддерживают ли модели Django первичные ключи нескольких столбцов?» :

Нет. Поддерживаются только первичные ключи с одним столбцом.

Но на практике это не проблема, потому что ничто не мешает вам добавить другие ограничения (используя опцию unique_together модель или создать ограничение непосредственно в вашей базе данных) и обеспечить уникальность на этом уровне. Первичные ключи с одним столбцом необходимы для работы таких объектов, как интерфейс администратора; например, вам нужен простой способ указать объект для редактирования или удаления.

То, что вы видите, это не два первичных ключа, а скорее двухколонный первичный ключ. Таблицы по определению могут иметь только один первичный ключ.

2 голосов
/ 20 июля 2011

Это составной первичный ключ.Попробуйте выполнить это:

show create table mytable;

Он должен показать вам определение составного ключа.

Это не является чем-то "необычным" с точки зрения mysql.

...