MySQL数据库中指定的两个主键

时间:2011-07-19 22:15:01

标签: mysql django primary-key models

我正在尝试创建一个测试数据库,它是预先存在的数据库的副本。我正在使用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中引发错误类,错误值   _mysql_exceptions.OperationalError:(1068,'多个主键定义')

django docs中写的是Django不允许多个主键。但是,查看原始MySQL数据库中DESCRIBE [tablename]的输出,看起来就是这里正在发生的事情:

        +------------+------------+------+-----+---------+-------+
        | 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(Example 1Example 2Example 3)上看到很多关于基于多列创建主键的主题 - 我正在看到一个复合词键?在这种情况下,如何通过Django模型进行中继,即如何复制它?

如果它不是复合键,它是什么?

3 个答案:

答案 0 :(得分:3)

Django目前does not support multi-column primary keys虽然有补丁/分叉可以扩展它(具有不同程度的抛光)。来自常见问题"Do Django models support multiple column primary keys?"

  

没有。仅支持单列主键。

     

但这在实践中不是问题,因为没有什么能阻止您添加其他约束(使用unique_together model option或直接在数据库中创建约束),并强制执行该级别的唯一性。需要单列主键才能使管理界面正常工作;例如,您需要一种能够指定要编辑或删除的对象的简单方法。

您所看到的不是两个主键,而是一个两列主键。表按定义只能有一个主键。

答案 1 :(得分:3)

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_')

这将保留两列主键行为。

答案 2 :(得分:2)

这是一个复合主键。尝试执行此操作:

show create table mytable;

它应该显示复合键的定义。

从mysql的角度来看,这并非“不寻常”。