【问题标题】:MYSQL issue 1025MYSQL 问题 1025
【发布时间】:2013-08-25 01:08:27
【问题描述】:

在 MYSQL 中的新功能,我尝试手动为现有表创建外键,因为 Django 不会修改它。

python2 manage.py sqlall <appname>

显示了我的预期,但是

python2 manage.py syncdb

没有对表格做任何事情。 以下是模型:

class A(models.Model):
  A_field1 = models.IntegerField(unique=True) # is not the primary key
  A_field2 = models.CharField(max_length=200)
  ...
  A_field3 = models.CharField(max_length=30)

# this method is to get the good name in the admin interface
def __unicode__(self):
  return self.name


class B(models.Model):
  B_field1 = models.FloatField()
  ...
  B_field2 = models.ForeignKey(A, to_field='A_field1')

但显然我操作错误,因为我在运行服务器时没有找到引用的字段,所以我尝试删除外键,我得到了这个奇怪的错误:

mysql> ALTER TABLE A DROP COLUMN A_field1;
ERROR 1025 (HY000): Error on rename of './website/#sql-41e_740' to
'./website/<tablename>' (errno: 150)

我也试过了

mysql> ALTER TABLE B DROP COLUMN B_field2;

但得到了与上面几乎相同的错误

有什么想法吗?

这里的表格:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| A_field1     | int(11)      | NO   | PRI | NULL    | auto_increment |
| A_field2     | varchar(200) | NO   |     | NULL    |                |
| A_field3     | varchar(30)  | NO   |     | NULL    |                |
....   
+--------------+--------------+------+-----+---------+----------------+


+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| id              | int(11)  | NO   | PRI | NULL    | auto_increment |
| B_field1        | double   | NO   |     | NULL    |                |
 ...
| B_field2        | int(11)  | NO   | MUL | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+

【问题讨论】:

  • 这不是应用程序问题,这是数据库中的数据结构问题。因此,请提供您的表格完整结构

标签: mysql django foreign-keys


【解决方案1】:

你不能使用列名删除外键,所以:

SHOW CREATE TABLE myTable 

这将显示您的 KEY 的名称,然后放下它

 ALTER TABLE myTable DROP FOREIGN KEY its_name

然后也删除列

ALTER TABLE mytable DROP COLUMN myColumn;

【讨论】:

  • 为什么 django 拒绝这样做?
  • 不是django,Mysql错误150是外键格式错误。外键引用的列必须是完全相同的类型,或者为不存在的东西添加外键。
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2013-11-09
  • 2010-09-14
  • 2014-01-25
  • 2011-01-09
  • 2011-01-14
相关资源
最近更新 更多