Création de la key primaire sur la table SQL existante

J'ai un tableau du formulaire suivant:

create table tab1(i1 int, i2 character varying); 

Je veux faire de i1 la key primaire. Cependant, mon problème est que la colonne i1 contient des lignes en double. Pour y parvenir j'ai créé un tableau du formulaire suivant:

  create table tab2(i1 int, i2 character varying); insert into tab2 (i1, i2) (select distinct * from tab1); alter table tab2 add primary key(i1); 

Après cela, j'obtiens l'erreur suivante:

 NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "tab2_pkey" for table "tab2" ERROR: could not create unique index "tab2_pkey" DETAIL: Key (i1)=(1958) is duplicated. 

Quelqu'un peut-il m'aider s'il vous plaît à créer la key primaire sur tab2?

 Key (i1)=(1958) is duplicated. 

S'il vous plaît exécuter select

 select distinct * from tab1 where i1 = 1958 

et assurez-vous que cela returnnera plusieurs lignes dans le résultat. Par exemple, les lignes

  | i1 | i2 | | 1958 | '1' | | 1958 | '2' | 

est différent et distinct return 2 lignes. Si vous avez vraiment besoin d'une key primaire sur le i1, vous devez fournir des valeurs uniques sont insérées. Essaye ça:

 insert into tab2 (i1, i2) (select i1, max(i2) from tab1 group by i1); 

Au lieu de la fonction max (), vous pouvez utiliser n'importe quelle agrégation.

Vous ne pouvez pas avoir plusieurs loggings avec la même key primaire i1 et différentes valeurs dans i2, car la key primaire est censée identifier les loggings de manière unique.

Dans votre cas, quel logging est identifié par i1 = 1958?

Si toutes les valeurs i2 sont identiques pour un i1 donné, vous avez des loggings en double et vous devez les supprimer avant de créer la key primaire sur i1, si certaines valeurs i2 sont différentes pour une valeur i1 donnée, vous devez choisir une autre key primaire ( par exemple, ajoutez une colonne d'identité et créez la key primaire sur cette colonne).