2013-06-26 99 views
1

我有這個問題,當我嘗試保存一個新進入一個名爲「配置」表中,Django的:IntegrityError:重複鍵值違反唯一約束

class Config(models.Model): 
    ident = models.CharField(max_length=uuidLength, null=True, editable=False) 
    scanner = models.ForeignKey('Scanner') 
    name = models.CharField(max_length=64) 
    ''' some other fields ''' 

和Postgres給了這樣的錯誤(應用程序被稱爲「飛馬」,這樣的Django給表名實際上是「pegasus_config」):

IntegrityError: duplicate key value violates unique constraint "pegasus_config_scanner_id_name_key" 
DETAIL: Key (scanner_id, name)=(2,) already exists. 

我搜索計算器中,發現this解決方案,問題是,我不知道哪個表,我應該重置索引。 我做了以下根據答案:

SELECT setval('pegasus_config_id_seq', (SELECT MAX(id) FROM pegasus_config)+1) 

但問題仍然存在。我也進入數據庫,發現「pegasus_config_scanner_id_name_key」實際上是一個索引。所以我很困惑要重置哪個索引?請幫忙。謝謝。

+0

我想你應該丟棄的索引。在我看來,表格正在將'scanner_id'和'name'字段作爲Key。這是你想要的嗎? –

回答

0

你可以嘗試像下面來確定哪些表具有唯一約束定義查詢:

SELECT n.nspname as schema_name, 
     co.conrelid::regclass as table_name, 
     co.conname as constraint_name, 
     pg_catalog.pg_get_constraintdef(co.oid, true) as constraing_def 
FROM pg_constraint co 
INNER JOIN pg_catalog.pg_class cl ON cl.oid = co.conrelid 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = cl.relnamespace 
WHERE co.conname = 'pegasus_config_scanner_id_name_key' 
AND co.contype = 'u' 
+0

還要注意,定義爲NOT NULL的列上定義的UNIQUE約束/索引如果其中一個約束列中的值爲NULL,則可能會有重複條目。我不是在暗示這是這裏的問題,但當我在違反約束(「名稱」列)中看到NULL時,我想到了這一點。 – bma

相關問題