SQL Server - Duplicati non ammessi

giovedì 18 maggio 2006 - 16.44

Teech Profilo | Expert

Ho una domanda, forse stupida, su SQL Server.
Il caso pratico:
stò creando una tabella dove inserire gli utenti di un'applicazione. Nella tabella ho inserito i seguenti campi:
ID - uniqueidentifier - not null
Operatore - char(30) - not null
Nome - char(30) - not null
Cognome - char(30) - not null

Come posso fare per non inserire 2 record con lo stesso valore nel campo operatore? in access c'è la proprietà di indicizzazione a duplicati non ammessi, ma in SQL Server come faccio?

Grazie
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alx_81 Profilo | Guru

Devi fare un indice univoco sul campo operatore..

CREATE UNIQUE NONCLUSTERED INDEX IX_Operatore ON NomeTabella
(
operatore
) ON [PRIMARY]

che SQL Server hai?
7.0?
2000?
2005?

perchè c'è anche una procedura user friendly (visiva e non da codice)
Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>stò creando una tabella dove inserire gli utenti di un'applicazione.
>Nella tabella ho inserito i seguenti campi:
>ID - uniqueidentifier - not null
>Operatore - char(30) - not null
>Nome - char(30) - not null
>Cognome - char(30) - not null

Ciao Maurizio,

alcune considerazioni:

1) Non utilizzare una colonna uniqueidentifier per referenziare univocamente ogni riga della tabella in quando occupa ben 16 bytes e la definizione di un indice risulterebbe meno performante rispetto ad una colonna ad esempio di tipo int (4 bytes).
Quindi, definisci ID come int e imposta l'attributo IDENTITY che si comporta come l'autonumber di Access;

2) Non definire le altre colonne come char perché altrimenti se inserisci 1 o 30 caratteri occuperai sempre 30 bytes; al suo posto utilizza il data type varchar.

3) Definisci un constraint PRIMARY KEY sulla colonna ID.

4) Definisci un constraint UNIQUE sulla colonna Operatore.

Vediamo un esempio:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>Grazie
Prego.

Ciao!

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

lbenaglia Profilo | Guru

>Devi fare un indice univoco sul campo operatore..
>
>CREATE UNIQUE NONCLUSTERED INDEX IX_Operatore ON NomeTabella

No.
Attenzione a non confondere un indice con un constraint: logicamente sono due oggetti COMPLETAMENTE DIFFERENTI.
Un indice è una struttura dati che serve per velocizzare gli accessi ad una tabella, mentre un constraint è un sistema per limitare le informazioni che possono essere inserite a livello di dominio (colonna), di entità (tabella) o di relazione (tra tabelle).

Dal punto di vista fisico SQL Server utilizza un indice unique per garantire l'univocità di un constraint unique, ma non è detto che in futuro l'univocità possa essere garantita in altro modo, quindi occhio a non fare confusione!

Trovi qualche link in questo post:
http://groups.google.it/group/microsoft.public.it.sql/msg/2f2b9ea5e249e5d4

Ciao!

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

alx_81 Profilo | Guru

Una sola domanda Lorenzo..
Facendo il constraint Unique, viene creato automaticamente un nonclustered index unique.. vero??
Giusto per sapere se quello che ho sempre fatto è del tutto sbagliato.
Alx81 =)

http://blogs.dotnethell.it/suxstellino

Teech Profilo | Expert

Penso che più chiaro di così fosse impossibile...
Grazie mille!!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alx_81 Profilo | Guru

Ok, che siano diversi siamo d'accordo..
è solo che sono ancora convinto che facendo un constraint unique, cmq viene creato il relativo indice..
tutto qui..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>Facendo il constraint Unique, viene creato automaticamente un
>nonclustered index unique.. vero??

Si. I BOL dicono: "The Database Engine automatically creates a UNIQUE index to enforce the uniqueness requirement of the UNIQUE constraint. Therefore, if an attempt to insert a duplicate row is made, the Database Engine returns an error message that states the UNIQUE constraint has been violated and does not add the row to the table. Unless a clustered index is explicitly specified, a unique, nonclustered index is created by default to enforce the UNIQUE constraint".

Se vuoi he venga creato un indice clustered puoi sempre specificarlo nel comando CREATE|ALTER TABLE in base alla sintassi:

<column_constraint> ::= [ CONSTRAINT constraint_name ] { { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor | WITH ( < index_option > [ , ...n ] ) ]


>Giusto per sapere se quello che ho sempre fatto è del tutto sbagliato.
Definire un indice per garantire l'univocità è "sbagliato" dal punto di vista logico.

Ciao!

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

alx_81 Profilo | Guru

perfetto. grazie.. Sono totalmente d'accordo con te

fortunatamente l'ho fatto su tabelle enormi, così anche la velocizzazione mi aiuta un pochino...
grazie mille!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5