Delen via


Unieke beperkingen en controlebeperkingen

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-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 NULLtoe. 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 CheckTblmoet 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 CheckTblworden 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.

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