J'ai une table et je veux m'assurer que pas deux rangées ne peuvent être semblables.
Donc, par exemple, cette table serait valide: p> Mais cette table ne serait pas: p> c'est parce que la dernière table a deux instances de donc, Comment puis-je empêcher de telles occurrences dans une table PostgreSQL 11.5? P> J'essaierais d'expérimenter un code SQL mais Hélas Je suis toujours nouveau sur la question. P> Veuillez noter que c'est pour merci p> p> 1 | Thinkjet code>. P> user_id code> peut être répété (c'est-à-dire 1 code>) et l'imprimante peut être répété (c.-à-d. laserwriter code>) mais une fois un disque comme 1 | Thinkjet code> est entré une fois que la combinaison ne peut pas être entrée à nouveau. P> insérer des données code> dans la table, pas Sélectionnez CODE> ING IT. < / strong> comme une contrainte IIRC. p>
4 Réponses :
Vous pouvez utiliser distinct. Par exemple: c'est tout. J'espère que cela aide! P> p>
Merci, mais cela seulement montre i> distincts distincts, je peux toujours insérer des enregistrements identiques dans la table, ce que je ne veux pas pouvoir faire.
Oh pardon. J'ai compris. Vous devez vérifier votre colonne d'imprimante comme unique dans la base de données. De cette façon, vous ne pourrez pas insérer un enregistrement en double.
Eh bien, je pourrais faire cela, mais j'aimerais avoir des entrées d'imprimante en double et dupliquer User_id Entre, mais je ne veux pas avoir le même enregistrement user_id / imprimante deux fois. J'ai mis à jour mon exemple pour clarifier.
Je suis désolé que l'anglais n'est pas ma langue principale. J'essaierai. Prenons une nouvelle table. user_id code> = 1 code> et imprimante code> = thinkjet code> dans la première ligne. Si vous essayez à nouveau ( 1 code> et thinkjet code>) il fonctionnera normalement. Je le veux, il est donc possible d'erreur si vous essayez à nouveau d'ajouter cette combinaison. B> Si vous ajoutez user_id code> = code> 1 code> Imprimante code> > = laserwriter code>, cela fonctionne depuis que cette combinaison n'est pas déjà utilisée. Si vous ajoutez user_id code> = 2 code> et imprimante code> = thinkjet code> qui fonctionnera car cette combinaison n'est pas déjà utilisée non plus. J'espère que ça aide.
Voici votre script
ALTER TABLE tableA ADD CONSTRAINT some_constraint PRIMARY KEY(user_id,printer);
INSERT INTO tableA(user_id, printer)
VALUES
(
1,
'LaserWriter'
)
ON CONFLICT (user_id, printer)
DO NOTHING;
Merci, mais je reçois une erreur : il n'y a pas de contrainte unique ou d'exclusion correspondant à la spécification de conflit code>
modifier votre table d'abord.
Ne pas sembler impoli, mais si j'ai déjà fait une contrainte pour rendre la colonne User_id et imprimante, la clé primaire Pourquoi dois-je ajouter le supplémentaire sur le conflit code> ... Ne faites rien; code> pièces?
On dirait que vous obtenez votre problème actuel. À l'avenir, vous pouvez trouver des situations où vous voulez une unicité ou une autre contrainte, sur autre chose qu'une clé primaire. Postgres a toutes sortes d'options à explorer, notamment chèque, uniques et des domaines. postgreSQL.org/docs/current/... < / a>
@MorRISDEORYX Oui, mais dans ce tableau, je ne le garderai plus que dans ces deux colonnes (toutes les autres contraintes sont toutes triées déjà). Je vois que cela soit utile dans d'autres tables / colonnes, cependant. Merci
J'ai trouvé la réponse. Lors de la création du tableau, je devais spécifier les deux colonnes comme unique. Observez:
=# INSERT INTO foo VALUES (1, 'LaserWriter');
INSERT 0 1
=# INSERT INTO foo VALUES (4, 'LaserWriter');
INSERT 0 1
=# INSERT INTO foo VALUES (1, 'ThinkJet');
INSERT 0 1
=# INSERT INTO foo VALUES (2, 'DeskJet');
INSERT 0 1
=# INSERT INTO foo VALUES (1, 'ThinkJet');
ERROR: duplicate key value violates unique constraint "foo_user_id_printer_key"
DETAIL: Key (user_id, printer)=(1, ThinkJet) already exists.
=# SELECT * FROM foo;
user_id | printer
---------+-------------
1 | LaserWriter
4 | LaserWriter
1 | ThinkJet
2 | DeskJet
(4 rows)
Vous avez besoin d'une série d'étapes (en supposant qu'il n'y ait pas de clé unique déjà attribuée).
alter table your_table add temp_unique integer unique;
do $$
declare
row_num integer = 1;
c_assign cursor for
select temp_unique
from your_table
for update;
begin
for rec in c_assign
loop
update your_table
set temp_unique = row_num
where current of c_assign;
row_num = row_num + 1;
end loop;
end;
$$
delete from your_table ytd
where exists ( select 1
from your_table ytk
where ytd.user_id = ytk.user_id
and ytd.printer = ytk.printer
and ytd.temp_unique > ytk.temp_unique
) ;
alter table your_table add constraint id_prt_uk unique (user_id, printer);
alter table your_table drop temp_unique;
Cela fonctionne probablement, mais c'est bien sur ce que ma connaissance SQL est. * Dizzy * Merci pour l'aide, peu importe