Constraint yani türkçe karşılığıla kısıtlama, veritabanında DML işlemlerine çeşitli kontroller koymak için tanımlanan kurallardır. Örneğin, müşteri bilgilerin tutulduğu bir tabloda müşteri telefon numarasının boş girilmesini önlemek için veya unique müşteri numaraları için kolona constraint eklenebilir.
Constraint tablo oluşturulurken ya da tablo yapısını değiştirerek oluşturulabilir.
Oracle tarafında 5 adet constraint bulunmaktadır. Bunlar;
- Primary Key
- Unique Key
- Foreing Key
- Not Null
- Check
- Primary Key
Veritabanında oluşturalan tablolardaki kayıtlar için verilen unique(eşşiz) id’lerin başka bir kayıt içinde verilmesinin önüne geçer. Ayrıca primary key ile birlikte o kolona null(boş kayıt) verilmesini engeller.
Primery key tabloyu oluştururken
CREATE TABLE PERSONEL ( ID NUMBER PRIMARY KEY, NAME VARCHAR2 (20), SURNAME VARCHAR2 (20), DEPT VARCHAR2 (20) )
Ya da sonradan ekleyebiliriz
ALTER TABLE PERSONEL ADD ( CONSTRAINT PK_PERSONEL PRIMARY KEY (ID) USING INDEX )
Primary key constraint oluşturduğumuzda veritabanı otamatik olarak o kolon için unique bir index oluşturur.
- Unique Key
Unique key’de primary key gibi tablolardaki unique(eşşiz) id’lerin başka bir kayıt içinde verilmesinin önüne geçer. Primary key ve unique key arasındaki farklar.
Primary Key | Unique Key |
Tabloda sadece bir tane oluşturulabilir. | Birden fazla oluşturulabilir. |
Null kayıt girilemez. | Null kayıt girilebilir. |
ALTER TABLE PERSONEL ADD (CREATE TABLE PERSONEL ( ID INTEGER UNIQUE, ADI_SOYADI VARCHAR2 (20 BYTE), SEHIR VARCHAR2 (20 BYTE) );
CONSTRAINT UQ_PERSONEL UNIQUE (ID) USING INDEX ENABLE VALIDATE);
- Foreing Key
Foreing Key bir tablodaki primery key olan kayıtın başka bir tablodaki kayıtla ilişkilendirmesidir. Bir tablo için foreing key oluşturduğumuz zaman bu tabloya gireceğimiz yeni kayıtların ilişkilendirdiği tabloyla eşleşmesi gerekmektedir.
Önce primery key ilişkilendirilecek olan tabloyu oluşturalım ve ID kısmına primery key tanımlıyalım
CREATE TABLE CONS ( ID NUMBER(10), RAND_ST VARCHAR2(40 BYTE), RAND_ST2 VARCHAR2(40 BYTE), RAND_ST3 VARCHAR2(1 BYTE), RAND_DATE DATE ) ALTER TABLE CONS ADD ( CONSTRAINT PK_CONS PRIMARY KEY (ID) USING INDEX ENABLE VALIDATE);
Sonra ikinci tabloyu oluşturalım ve bunun ID kolonunu bir önceki tablonun ID kolonuyla ilişkilendirilem.
CREATE TABLE CONS_FKEY ( ID NUMBER, SALARY NUMBER ) ALTER TABLE CONS_FKEY ADD ( CONSTRAINT FK_CONS_FKEY FOREIGN KEY (ID) REFERENCES CONS (ID) ENABLE VALIDATE);
Bu sayede ilk tabloda ID kayıtı olmayan bir kayıt ikinci tabloya kayıt olarak girilmesinin önüne geçmiş oluruz ve gelişi güzel kayıtlar olmasının önüne geçilir.
- Not Null
Tablodaki bir kolona boş kayıt girilmesinin önüne geçilir.
CREATE TABLE PERSONEL ( ID INTEGER Not Null, ADI_SOYADI VARCHAR2 (20 BYTE), SEHIR VARCHAR2 (20 BYTE) );
- Check
Tablodaki kolonun belirleyeceğimiz değerlerde kayıt yapılmasını sağlar.
CREATE TABLE check_cost ( id NUMBER, name VARCHAR2 (50) );
Tablonun ID kolonu için alacağı değer aralığına göre constraint’imizi oluşturalım
ALTER TABLE check_cost ADD ( CONSTRAINT check_cost_id CHECK (id BETWEEN 1 and 99) ENABLE VALIDATE);
Bu değer aralığından farklı bir değer girdiğimizde uyarı yapacak.
insert into check_cost values(102,'TEST');ORA-02290: check constraint (CHECK_COST_ID) violated
Tablodaki NAME kolonu için büyük harfle değer girme kısıtlamasını oluşturalım
ALTER TABLE check_cost ADD ( CONSTRAINT check_cost_name_upper CHECK (name = upper(name)) ENABLE VALIDATE);
Eğer gireceğimiz karakter küçük harfler içerirse uyarı yapacak.
insert into check_cost values(12,'teST'); ORA-02290: check constraint (CHECK_COST_NAME_UPPER) violated