2009-04-01 9 views
2

Existe-t-il un moyen d'insérer dans une base de données SQL où l'enregistrement entier est unique? Je sais que vous pouvez créer des clés primaires et des colonnes uniques, mais ce n'est pas ce que je veux.Enregistrement unique SQL non colonne?

Quelle est la meilleure façon de le faire sans surcharger la base de données? J'ai vu une sorte de sous-requête où vous utilisez "WHERE NOT EXISTS()"

Je veux juste savoir la façon la plus efficace d'insérer un enregistrement afin qu'il n'y ait pas de doublons du même enregistrement EXACT.

Merci d'avance!

+1

Je pense que vous pourriez vouloir préciser ce que vous voulez avec quelques exemples. La question est vraiment difficile à suivre. – JohnFx

+0

La seule raison que je peux penser pour avoir besoin de cela est parce que vous n'avez pas de clé primaire. Si vous ne voulez pas de colonne auto-incrémentée dédiée à l'utilisation de la clé primaire, vous pouvez créer une clé primaire composite, souvent utile pour de nombreuses tables associatives. – nilamo

Répondre

0

Vous pouvez faire:

create table #temp (val1 varchar(30), val2 varchar(30)) 


declare @val1 varchar(30),@val2 varchar(30) 
select @val1='josh',@val2='bob' 

insert into #temp 
select @val1, @val2 
where not exists (select * from #temp where [email protected] and [email protected]) 

Courez la moitié inférieure deux fois et il ne sera pas insérer l'enregistrement plus d'une fois.

3

Vous savez créer un index unique sur une colonne.

Assurez que sur toutes les colonnes qui doivent, ensemble, être unique:

create unique index foo 
on tablename(columnone, columntwo, columnthree); 

Notez que la nécessité de le faire peut être une indication que votre table est pas suffisamment normalisée.

+0

+1. Cela aurait été ma réponse (si j'avais été un peu plus rapide :-) - faire une clé unique sur toute la ligne. Cher en termes d'espace (c'est-à-dire, deux copies de chaque rangée) mais la solution la plus facile et la plus sûre. – paxdiablo

+0

+1 pour une note normalisée. Pourquoi voudriez-vous cela, sauf si vous n'avez pas de clé primaire? – nilamo

1

Vous pouvez ajouter une contrainte unique à la définition de table et inclure toutes les colonnes (à l'exception de la clé primaire, je crois). Des contraintes uniques créent des index, donc je n'ai aucune idée du type d'impact sur les performances que cela pourrait avoir, mais je suppose que moins il y a de colonnes, mieux c'est.

Cela ajoutera une telle contrainte à une table existante:

ALTER TABLE SampleTable 
ADD CONSTRAINT [uc_UniqueRow] UNIQUE (Column1, Column2, Column3) 

Notez qu'il existe certaines restrictions sur les types de colonnes, etc. donc cela peut ou peut ne pas fonctionner pour votre table. Voir la documentation en ligne pour plus de détails: http://msdn.microsoft.com/en-us/library/ms177420(sql.90).aspx

+0

S'il y a une clé primaire, vous n'avez pas besoin de la contrainte unique 'toutes les colonnes'; la clé primaire dans ce cas serait «toutes les colonnes». –

0

Votre question est assez claire (ne sais pas pourquoi d'autres ont répondu avec quelque chose que vous auriez voulu exclure spécifiquement), et quelque chose que j'avait passé plus d'une heure à essayer de trouver ...

Ce lien a été très utile http://www.timrosenblatt.com/blog/2008/03/21/insert-where-not-exists/

Sur mySQL 5.1.35 ...

mysql> CREATE TABLE testDupeSyntax (name varchar(10), place varchar(20)); 
Query OK, 0 rows affected (0.13 sec) 

mysql> 
mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT 
EXISTS(SELECT name FROM testDupeSyntax WHERE name='mango1' LIMIT 1); 
Query OK, 1 row affected (0.06 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM testDupeSyntax; 
+--------+--------+ 
| name | place | 
+--------+--------+ 
| mango1 | mango2 | 
+--------+--------+ 
1 row in set (0.00 sec) 

mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT 
EXISTS(SELECT name FROM testDupeSyntax WHERE name='mango1' LIMIT 1); 
Query OK, 0 rows affected (0.00 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM testDupeSyntax; 
+--------+--------+ 
| name | place | 
+--------+--------+ 
| mango1 | mango2 | 
+--------+--------+ 
1 row in set (0.00 sec) 

mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT 
EXISTS(SELECT name FROM testDupeSyntax WHERE name='mango1' AND place='mango2' LIMIT 1); 
Query OK, 0 rows affected (0.00 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM testDupeSyntax; 
+--------+--------+ 
| name | place | 
+--------+--------+ 
| mango1 | mango2 | 
+--------+--------+ 
1 row in set (0.00 sec) 

mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT 
EXISTS(SELECT name FROM testDupeSyntax WHERE name='mango1' AND place='mango3' LIMIT 1); 
Query OK, 1 row affected (0.05 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM testDupeSyntax; 
+--------+--------+ 
| name | place | 
+--------+--------+ 
| mango1 | mango2 | 
| mango1 | mango2 | 
+--------+--------+ 
2 rows in set (0.00 sec) 

mysql> 
Questions connexes