Unieke beperkingen en controlebeperkingen
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
UNIQUE
beperkingen en CHECK
beperkingen zijn twee typen beperkingen die kunnen worden gebruikt om gegevensintegriteit in SQL Server-tabellen af te dwingen. Dit zijn belangrijke databaseobjecten.
Dit artikel bevat de volgende secties.
UNIEKE beperkingen
Beperkingen zijn regels die de SQL Server Database Engine voor u afdwingt. U kunt bijvoorbeeld UNIQUE
beperkingen gebruiken om ervoor te zorgen dat er geen dubbele waarden worden ingevoerd in specifieke kolommen die niet deelnemen aan een primaire sleutel. Hoewel zowel een UNIQUE
-beperking als een PRIMARY KEY
beperking uniekheid afdwingt, gebruikt u een UNIQUE
beperking in plaats van een PRIMARY KEY
beperking wanneer u de uniekheid van een kolom (of combinatie van kolommen) wilt afdwingen die niet de primaire sleutel is.
In tegenstelling tot PRIMARY KEY
beperkingen staan UNIQUE
beperkingen de waarde NULL
toe. Net als bij elke waarde die deelneemt aan een UNIQUE
beperking, is er echter slechts één null-waarde per kolom toegestaan. Er kan naar een UNIQUE
-restrictie worden verwezen door een FOREIGN KEY
-restrictie.
Wanneer een UNIQUE
beperking wordt toegevoegd aan een bestaande kolom of kolommen in de tabel, onderzoekt de database-engine standaard de bestaande gegevens in de kolommen om ervoor te zorgen dat alle waarden uniek zijn. Als een UNIQUE
beperking wordt toegevoegd aan een kolom met dubbele waarden, retourneert de database-engine een fout en wordt de beperking niet toegevoegd.
De database-engine maakt automatisch een UNIQUE
index om de uniekheidsvereiste van de UNIQUE
beperking af te dwingen. Als er daarom een poging wordt gedaan om een dubbele rij in te voegen, retourneert de database-engine een foutbericht waarin wordt aangegeven dat de UNIQUE
beperking is geschonden en de rij niet aan de tabel wordt toegevoegd. Tenzij expliciet een geclusterde index wordt opgegeven, wordt er standaard een unieke, niet-geclusterde index gemaakt om de UNIQUE
beperking af te dwingen.
CHECK-beperkingen
CHECK
-beperkingen zorgen voor domeinintegriteit door de waarden te beperken die door een of meer kolommen worden geaccepteerd. U kunt een CHECK
beperking maken met elke logische (Booleaanse) expressie die TRUE
of FALSE
retourneert op basis van de logische operators. Het bereik van waarden voor een salary
kolom kan bijvoorbeeld worden beperkt door een CHECK
beperking te maken die alleen gegevens toestaat van $ 15.000 tot $ 100.000. Dit voorkomt dat salarissen buiten het normale salarisbereik worden ingevoerd. De logische expressie zou het volgende zijn: salary >= 15000 AND salary <= 100000
.
U kunt meerdere CHECK
beperkingen toepassen op één kolom. U kunt ook één CHECK
beperking toepassen op meerdere kolommen door deze op tabelniveau te maken. Een beperking voor meerdere kolommen CHECK
kan bijvoorbeeld worden gebruikt om te bevestigen dat een rij met een country_region
kolomwaarde van USA
ook een waarde van twee tekens bevat in de state
kolom. Hierdoor kunnen meerdere voorwaarden op één locatie worden gecontroleerd.
CHECK
beperkingen zijn vergelijkbaar met FOREIGN KEY
beperkingen omdat ze de waarden bepalen die in een kolom worden geplaatst. Het verschil is hoe ze bepalen welke waarden geldig zijn: FOREIGN KEY
beperkingen de lijst met geldige waarden uit een andere tabel verkrijgen, terwijl CHECK
beperkingen de geldige waarden van een logische expressie bepalen.
Voorzichtigheid
Beperkingen die impliciete of expliciete conversie van gegevenstypen bevatten, kunnen ertoe leiden dat bepaalde bewerkingen mislukken. Dergelijke beperkingen die zijn gedefinieerd voor tabellen die bronnen van partitiewisseling zijn, kunnen er bijvoorbeeld toe leiden dat een ALTER TABLE...SWITCH
bewerking mislukt. Vermijd conversie van gegevenstypen in beperkingsdefinities.
Beperkingen van CHECK-voorwaarden
CHECK
beperkingen weigeren waarden die resulteren in FALSE
. Omdat null-waarden resulteren in ONBEKEND, kan de aanwezigheid in expressies een beperking overschrijven. Stel dat u een beperking op een kolom plaatst MyColumn
die aangeeft dat MyColumn
alleen de waarde 10 (MyColumn=10
) mag bevatten. Als u de waarde NULL
invoegt in MyColumn
, dan wordt NULL
ingevoegd en wordt er geen foutmelding geretourneerd.
Een CHECK
beperking retourneert TRUE
wanneer de voorwaarde die wordt gecontroleerd niet FALSE
voor een willekeurige rij in de tabel. Een CHECK
restrictie werkt op het niveau van de rij. Als een tabel die is gemaakt geen rijen heeft, wordt een CHECK
beperking voor deze tabel als geldig beschouwd. Deze situatie kan onverwachte resultaten opleveren, zoals in het volgende voorbeeld.
CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO
CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
DECLARE @retval INT;
SELECT @retval = COUNT(*)
FROM CheckTbl;
RETURN @retval;
END;
GO
ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO
De CHECK
beperking die wordt toegevoegd, geeft aan dat er ten minste één rij in tabel CheckTbl
moet zijn. Omdat er echter geen rijen in de tabel staan waarmee de voorwaarde van deze beperking moet worden gecontroleerd, slaagt de ALTER TABLE
instructie.
CHECK
beperkingen worden niet gevalideerd tijdens DELETE
uitdrukkingen. Het uitvoeren van DELETE
instructies voor tabellen met bepaalde typen controlebeperkingen kan daarom onverwachte resultaten opleveren. Denk bijvoorbeeld aan de volgende instructies die in tabel CheckTbl
worden uitgevoerd.
INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;
De DELETE
-verklaring slaagt, ook al geeft de CHECK
-beperkingsregel aan dat tabel CheckTbl
ten minste 1
rijen moet hebben.
Notitie
Als de tabel is gepubliceerd voor replicatie, moet u schemawijzigingen aanbrengen met behulp van de Transact-SQL instructie ALTER TABLE of SMO (SQL Server Management Objects). Wanneer schemawijzigingen worden aangebracht met de tabelontwerper of de ontwerpfunctie voor databasediagrammen, wordt geprobeerd de tabel te verwijderen en opnieuw te maken. U kunt gepubliceerde objecten niet verwijderen, waardoor de schemawijziging mislukt.
Gerelateerde taken
Taak | Artikel |
---|---|
Hierin wordt beschreven hoe u een unieke beperking maakt. | Unieke beperkingen maken |
Hierin wordt beschreven hoe u een unieke beperking wijzigt. | unieke beperkingen wijzigen |
Hierin wordt beschreven hoe u een unieke beperking verwijdert. | unieke beperkingen verwijderen |
Hierin wordt beschreven hoe u een controlebeperking maakt. | Controlebeperkingen maken |
Hierin wordt beschreven hoe u een controlebeperking uitschakelt wanneer een replicatieagent gegevens in uw tabel invoegt of bijwerken. | Controlebeperkingen voor replicatie uitschakelen |
Beschrijft hoe u een controlebeperking uitschakelt wanneer gegevens worden toegevoegd aan, bijgewerkt in of verwijderd uit een tabel. | Controlebeperkingen uitschakelen met INSERT- en UPDATE-instructies |
Beschrijft hoe u de beperkingsexpressie of de opties voor het in- of uitschakelen van de beperking voor specifieke voorwaarden wijzigt. | Validatievoorwaarden wijzigen |
Hierin wordt beschreven hoe u een controlebeperking verwijdert. | Controlebeperkingen verwijderen |
Hierin wordt beschreven hoe u de eigenschappen van een controlebeperking kunt weergeven. | unieke beperkingen en controlebeperkingen |