Campo duplicato

venerdì 20 luglio 2007 - 09.26

flytouch Profilo | Junior Member

Domanda da nabbo, su un db sql express ho la necessita di avere un campo che non ammetta duplicati, premetto che le relazioni esistenti sono state effettuate con chiave primaria e identita'. Non esiste come in access un duplicati non ammessi? Devo per forza costruire una funzione che controlli l'esistenza che un valore non venga ripetutto all'interno di tutti i campi?
Grazie in advance

SSUPERPIPPO Profilo | Guru

>Domanda da nabbo, su un db sql express ho
>la necessita di avere un campo che non
> ammetta duplicati, premetto che le relazioni
>esistenti sono state effettuate con chiave
>primaria e identita'.

I campi chiave primaria ammettono sempre e solo valori univoci!

>Non esiste come in access
>un duplicati non ammessi? Devo per forza
>costruire una funzione che controlli l'esistenza
>che un valore non venga ripetutto all'interno
>di tutti i campi?

Tra le proprietà degli indici è possibile specificare se il valore deve essere univoco!
Se usi SQL Server Management Studio e vai in definizione degli indici, troverai anche questa opzione.

>Grazie in advance

Ciao

Ale

flytouch Profilo | Junior Member

Credo di non essermi spiegato bene non e il campo chiave primaria che mi crea il problema per l'univocita, e un campo successivo che devo utilizzare per inserire un codice univoco perche durante gli inserimenti vorrei che un valore non fosse gia presente. Cioe se scrivo codice abcd in un primo momento, in un secondo momento se inputo nuovamente lo stesso codice avere l'errore che dice guarda il campo contiene gia questo valore fattu furbo mettine un altro :D
Grazie in advance di nuovo :D

SSUPERPIPPO Profilo | Guru

Con che strumento progetti la tua tabella?

Usi SQL Server Management Studio?

Puoi creare un indice per un qualsiasi campo (anche non chiave primaria), tra le proprietà degli indici è possibile specificare se il valore deve essere univoco!
Se usi SQL Server Management Studio e vai in definizione degli indici, troverai anche questa opzione.

Se invece crei la tabella a runtime fammi sapere che ti spiego come fare.

Ciao

Alessandro

flytouch Profilo | Junior Member

Si uso Visual studio management, tu dici in pratica di utilizzare le identita' se non ho capito male, pero ho il vincol odegli step, mentre ho la necessita' di inserire un valore univoco che non deve aver vincoli.
Grazie ancora

SSUPERPIPPO Profilo | Guru

Non ci siamo capiti...
nell'immagine qui sotto vedi in SQL Server Management Studio dove impostare la proprietà.
Lo trovi anche sugli indici che non sono chiave primaria.


674x631 75Kb


Ciao

Alessandro

flytouch Profilo | Junior Member

Ok si lo avevo trovato intanto, coi siamo capiti.. :D, senti secondo te e utile settare Ignora Chiave Duplicata? Nel caso in cui dovessi fare un update per correzione, non perdo la univocita?
Grazie Alessandro per l'aiuto che mi stai fornendo.

SSUPERPIPPO Profilo | Guru

Ignora chiavi duplicate:

Specifica l'effetto prodotto dall'inserimento di una riga con valore di chiave uguale a un valore di chiave esistente durante un'operazione di inserimento di massa. Se si sceglie:

Sì => SQL Server genera un avviso, ignora la riga in ingresso errata e tenta di inserire le righe rimanenti.

No => SQL Server genera un messaggio di avviso ed esegue il rollback dell'intera operazione di inserimento di massa.

Ciao

Alessandro

lbenaglia Profilo | Guru

>Domanda da nabbo, su un db sql express ho la necessita di avere
>un campo che non ammetta duplicati, premetto che le relazioni
>esistenti sono state effettuate con chiave primaria e identita'.
>Non esiste come in access un duplicati non ammessi?

Ciao,

SQL Server come Access e praticamente tutti i database relazionali in circolazione, permette di definire i constraint UNIQUE che servono proprio per garantire l'univocità di una colonna o insieme di colonne per tutte le righe di una tabella che non facciano parte della PRIMARY KEY.

Vediamo un piccolo esempio. Data la tabella Students voglio fare in modo che non sia possibile inserire due studenti con il medesimo nome e cognome:

USE tempdb; CREATE TABLE dbo.Students( StudentID int NOT NULL, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, CONSTRAINT PK_Students PRIMARY KEY(StudentID), CONSTRAINT UN_Name UNIQUE(FirstName, LastName) ); /* Questi inserimenti andranno a buon fine */ INSERT dbo.Students VALUES(1, 'Lorenzo', 'Benaglia'); INSERT dbo.Students VALUES(2, 'Luca', 'Bianchi'); INSERT dbo.Students VALUES(3, 'Andrea', 'Montanari'); INSERT dbo.Students VALUES(4, 'Marcello', 'Poletti'); /* Questo no */ INSERT dbo.Students VALUES(5, 'Lorenzo', 'Benaglia'); /* Output: Msg 2627, Level 14, State 1, Line 2 Violation of UNIQUE KEY constraint 'UN_Name'. Cannot insert duplicate key in object 'dbo.Students'. The statement has been terminated. */ DROP TABLE dbo.Students;

In pratica SQL Server definisce un indice UNIQUE sulle colonne FirstName e LastName che assume lo stesso nome del constraint, ma occhio a non confondere le due cose:

- Un indice è una struttura dati il cui unico scopo è quello di velocizare gli accessi in lettura/scrittura;
- Un constraint è un vincolo che limita i possibili valori di una colonna, di una tabella o di due tabelle.

In futuro un constraint UNIQUE potrà essere implementato diversamente, quindi non fare affidamento sul fatto che indice unique e constraint unique siano "la stessa cosa"

>Grazie in advance
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

flytouch Profilo | Junior Member

Grazie molte ad entrambe, avevo scartato Unique perche a quanto letto su msdn sconsigliava l'utilizzo ( se non ho capito male) per il fatto che assorbiva memoria. Pero in effetti sia il tuo consiglio che quello di alessandro sono preziosi. Grazie ancora a entrambe.

SSUPERPIPPO Profilo | Guru

Sempre a disposizione...

Ciao

Ale

P.S.: Se puoi clicca su Accetta risposta così chiudiamo il thread
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5