2012-03-27 143 views
1

我改變了外鍵的引用而不用改變字段的名字,現在我對同一個字段指向不同表的2個約束。 我的模型是這樣使用django的外鍵遷移南

class Activity(models.Model): 
    ... 
    source = models.ForeignKey(FSObject) 

,併成爲

class Activity(models.Model): 
    ... 
    source = models.ForeignKey(FreezedRef) 

現在我跑我的測試,當得到這個消息:

IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`test_tcf_api`.`storage_activity`, CONSTRAINT `source_id_refs_id_fc96b4b044ceb88` FOREIGN KEY (`source_id`) REFERENCES `storage_fsobject` (`id`))') 

我應該如何刪除舊的參考,很顯然,南跳過它。

回答

-1
  1. 停止使用糟糕的數據庫如MySQL,原因只有是一個有點八九不離十數據庫創建這樣innane問題(抱歉無法抗拒,但它是真實的)
  2. ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;直接從MySQL的文檔:http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
+0

爲什麼你認爲MySQL不好? – Andrew 2012-07-19 18:29:59

+1

默認情況下,默認情況下,這種方式並不符合ACID的標準,沒有ForeignKey約束,沒有事務處理,無法索引超過1k的字段(無論如何,這可能是個糟糕的設計,但仍然只有300個unicode字符),無法索引函數結果,沒有實現EXPLAIN ANALYZE,在模式更改命令期間沒有事務,查詢只對每個表的每個查詢使用一個索引(強制使用大量多列索引而不是動態組合索引)。我相信如果我花了一些時間,我可以想到更多,基本上我每週都會找到新的東西 – John 2012-07-19 19:18:07

+1

很顯然,我認識到一對夫婦(沒有fk和沒有交易)可以用innodb幫助,大多數人不能但有些可以。 InnoDB應該是默認的,如果你想快速和鬆散地獲得一些你應該交換到MyISAM的性能,而不是相反。關於MySQL IMO的唯一真正好處是它是第一個被廣泛採用的開源數據庫,併爲網絡開了很多選擇。對於PHP可以說類似的東西,我不認爲很多人會認爲PHP是驚人的或最好的工具。 – John 2012-07-19 19:21:55

0

您是否在同一遷移中更新了其他任何內容?他們工作還是休息?我只問,因爲我從來沒有在運行遷移時破壞任何東西 - 如果出現問題,它通常會在該過程中引發異常。

+1

他很可能是在處理mysql中的特質。在一個表是myISAM和另一個表是InnoDB之前,我已經遇到了這個問題。 South/django創建了當然失敗的約束,因爲myISAM不支持外鍵。不確定如何最終走上這條道路,但我已經看到了確切的問題。 – John 2012-03-27 23:04:37

+0

這是......有點堅果。 – Todd 2012-03-28 17:10:34

+0

因此,我的第一個建議是放棄垃圾數據庫並轉移到一些不太吸引人的地方。這只是使用mysql的衆多問題之一 – John 2012-03-28 20:04:30