我正在尝试创建一个测试数据库,它是预先存在的数据库的副本。我正在使用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 1,Example 2和Example 3)上看到很多关于基于多列创建主键的主题 - 我正在看到一个复合词键?在这种情况下,如何通过Django模型进行中继,即如何复制它?
如果它不是复合键,它是什么?
答案 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的角度来看,这并非“不寻常”。