Supprimer la “valeur de clé en double viole la contrainte unique” erreurs

Je suis le développement de Rails 3 app qui utilise Postgresql comme base de données. J'ai le tableau ci-dessous:

             Table "public.test"
    Column     |  Type   | Modifiers
---------------+---------+-----------
 id            | integer | not null
 some_other_id | integer |
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)
    "some_other_id_key" UNIQUE CONSTRAINT, btree (some_other_id)

Cela a deux colonnes:

  • id, qui est la clé primaire (créé automatiquement par rails)
  • some_other_id, qui contient les clés générées par un autre système. Cet id doit être unique, j'ai donc ajouté une contrainte de clé unique pour la table.

Maintenant, si j'essaie d'insérer une ligne avec un double some_other_id, il ne parvient pas (bon) et j'obtiens le résultat suivant dans mon Postgres journaux:

ERROR:  duplicate key value violates unique constraint "some_other_id_key"

Le problème est qu'il est totalement principale pour mon application pour essayer et ajouter le même ID à deux reprises, et mes journaux sont des envois en nombre avec ce message "ERREUR", ce qui provoque divers problèmes: les fichiers prennent beaucoup d'espace disque, les diagnostics se perdre dans le bruit, Postgres à jeter diags à conserver les fichiers journaux à l'intérieur des limites de taille, etc.

Personne ne sait comment je peux soit:

  • Supprimer le journal, soit par la suppression de tous les journaux à propos de cette clé, ou peut-être en spécifiant quelque chose sur la transaction qui tente de faire le INSERT.
  • Utiliser un autre Postgres fonction de repérer le double de la clé et de ne pas essayer la INSERT. J'ai entendu des règles et des déclencheurs, mais je ne peux pas obtenir soit pour le travail (même si je ne suis pas Postgres expert).

Noter que toute solution doit travailler avec les Rails de, qui ne de son insère comme ceci:

INSERT INTO test (some_other_id) VALUES (123) RETURNING id;
"Le problème, c'est qu'il est totalement principale pour mon application pour essayer et ad le même ID à deux reprises," Cela me semble étrange. Pourquoi l'application que vous essayez d'insérer des valeurs en double, et pourquoi vous pensez que c'est normal?
BTW votre insertion INSERT INTO test (some_other_id) VALUES (123) RETURNING id; ne fournit pas une valeur de l'id (qui n'est PAS NULLE), il devrait donc aussi violer la contrainte not NULL une pièce d'identité. Avez-vous nous donner la vraie définition de la table? est l'id d'une série, par hasard?

OriginalL'auteur Alex Hockey | 2012-09-12