Samenvatting: In deze handleiding leert u hoe u de SQL Server UNIQUE
constraint kunt gebruiken om de uniciteit van gegevens in een kolom of een groep kolommen te garanderen.
Inleiding tot SQL Server UNIQUE constraint
SQL Server UNIQUE
constraints stellen u in staat ervoor te zorgen dat de gegevens die zijn opgeslagen in een kolom, of een groep kolommen, uniek zijn onder de rijen in een tabel.
Het volgende statement creëert een tabel waarvan de gegevens in de kolom email
uniek zijn tussen de rijen in de tabel hr.persons
:
Code language: SQL (Structured Query Language) (sql)CREATE SCHEMA hr;GOCREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE);
In deze syntaxis definieert u de UNIQUE
constraint als een kolom constraint. U kunt de UNIQUE
constraint ook als een tabel constraint definiëren, zoals dit:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), UNIQUE(email));
achter de schermen maakt SQL Server automatisch een UNIQUE
index om de uniciteit af te dwingen van gegevens die zijn opgeslagen in de kolommen die deelnemen aan de UNIQUE
constraint. Daarom, als u probeert een dubbele rij in te voegen, weigert SQL Server de wijziging en geeft een foutmelding waarin staat dat de UNIQUE
beperking is geschonden.
Het volgende statement voegt een nieuwe rij in de tabel hr.persons
in:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
Het statement werkt zoals verwacht. Het volgende statement mislukt echter vanwege de dubbele e-mail:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
SQL Server geeft de volgende foutmelding:
Code language: Shell Session (shell)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Als u geen aparte naam opgeeft voor de UNIQUE
constraint, zal SQL Server er automatisch een naam voor genereren. In dit voorbeeld is de naam van de constraint UQ__persons__AB6E616417240E4E
, wat niet helemaal leesbaar is.
Om een bepaalde naam aan een UNIQUE
constraint toe te kennen, gebruikt u het CONSTRAINT
sleutelwoord als volgt:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), CONSTRAINT unique_email UNIQUE(email));
De volgende zijn de voordelen van het toewijzen van een UNIQUE
constraint een specifieke naam:
- Het is eenvoudiger om de foutmelding te classificeren.
- U kunt naar de constraint-naam verwijzen wanneer u deze wilt wijzigen.
UNIQUE constraint vs. PRIMARY KEY constraint
Hoewel zowel UNIQUE
als PRIMARY KEY
constraints de uniciteit van gegevens afdwingen, moet u de UNIQUE
constraint gebruiken in plaats van de PRIMARY KEY
constraint wanneer u de uniciteit van een kolom, of een groep kolommen, wilt afdwingen die niet de primaire sleutelkolommen zijn.
Verschillend van PRIMARY KEY
constraints, UNIQUE
constraints staan NULL
toe. Bovendien behandelen UNIQUE
constraints de NULL
als een gewone waarde, daarom staat het slechts één NULL
per kolom toe.
Het volgende statement voegt een rij in waarvan de waarde in de email
kolom NULL
is:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Nu, als u probeert nog een NULL
in te voegen in de email
kolom, krijgt u een foutmelding:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Hier is de uitvoer:
Code language: SQL (Structured Query Language) (sql)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
UNIQUE constraints voor een groep kolommen
Om een UNIQUE
constraint voor een groep kolommen te definiëren, schrijf je deze als een tabel constraint met kolomnamen gescheiden door komma’s, als volgt:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
Het volgende voorbeeld maakt een UNIQUE
constraint die bestaat uit twee kolommen person_id
en skill_id
:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
UNIQUE constraints toevoegen aan bestaande kolommen
Wanneer u een UNIQUE
constraint toevoegt aan een bestaande kolom of een groep kolommen in een tabel, onderzoekt SQL Server eerst de bestaande gegevens in deze kolommen om er zeker van te zijn dat alle waarden uniek zijn. Als SQL Server dubbele waarden vindt, geeft hij een foutmelding en wordt de UNIQUE
constraint niet toegevoegd.
Het volgende toont de syntaxis voor het toevoegen van een UNIQUE
constraint aan een tabel:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Voorstel dat u de volgende hr.persons
tabel hebt:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), phone VARCHAR(20),);
Het volgende statement voegt een UNIQUE
constraint toe aan de email
kolom:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
Op dezelfde manier voegt het volgende statement een UNIQUE
constraint toe aan de kolom Telefoon:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Verwijder UNIQUE constraints
Om een UNIQUE
constraint te definiëren, gebruikt u het ALTER TABLE DROP CONSTRAINT
statement als volgt:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
Het volgende statement verwijdert de unique_phone
constraint uit de hr.person tabel:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
Vernieuwen UNIQUE constraints
SQL Server heeft geen direct statement om een UNIQUE
constraint te wijzigen, daarom moet u de constraint eerst verwijderen en opnieuw maken als u de constraint wilt wijzigen.
In deze tutorial hebt u geleerd hoe u de SQL Server UNIQUE
constraint kunt gebruiken om ervoor te zorgen dat de gegevens in een kolom of een groep kolommen uniek zijn.