2013-06-26 3 views
1

У меня была эта проблема, когда я пытаюсь сохранить новую запись в таблицу под названием «конфигурации»,Джанго: 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 дал такую ​​ошибку (приложение называется «Пегас», так что имя таблицы, которая дает Джанго на самом деле «pegasus_config»):

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

Я искал в StackOverflow и нашел this решения, проблема в том, что я не знаю, какую таблицу следует сбросить индекс. я сделал следующее в соответствии с ответом:

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

, но проблема все еще существует. Я также зашел в базу данных и обнаружил, что «pegasus_config_scanner_id_name_key» на самом деле является индексом. Поэтому я смущен тем, какой индекс нужно сбросить? Пожалуйста помоги. Благодарю.

+0

Я думаю, вы должны отбросить этот индекс. Кажется мне, что таблица берет в качестве ключа поле «scanner_id» и «имя», то и другое. Это то, что вы хотите? –

ответ

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

Обратите внимание, что ограничения UNIQUE/индексы, определенные над столбцами, которые определены как NOT NULL, могут иметь повторяющиеся записи, если одно из значений в ограниченных столбцах равно NULL. Я не предполагаю, что здесь проблема, но мне пришло в голову, когда я увидел NULL в нарушении ограничений (столбец «name»). – bma