PostgreSQL PRIMARY KEY -FOREIGN KEY ON DELETE ve ON UPDATE
PostgreSQL PRIMARY KEY -FOREIGN KEY ON DELETE ve ON UPDATE,Tabloda Kolon Kısıtlamaları isimli yazımda primary key ve foreign key den bahsetmiştim.
Bu yazımda primary key ve foreing key de on delete ve on update ‘i anlatarak örnekler yapacağım.
-- DROP TABLE public.personel cascade;
CREATE TABLE public.personel
(
id integer NOT NULL UNIQUE,
isim character(50),
adres character(50) ,
tckimlikno character(11) ,
"maaş" real,
CONSTRAINT personel_pkey PRIMARY KEY (id)
-- CONSTRAINT personel_isim_tckimlikno_excl EXCLUDE USING gist (
-- isim WITH =,
-- tckimlikno WITH <>)
)
Yukarıda personel tablosunu oluştururken tablomuzun sonunda CONSTRAINT parametresi ile PRIMARY KEY komutu ile beraber tablo içerisinde PRİMARY KEY koyulması istenilen tabloyu belirterek tablomuzu oluşturuyoruz.
-- DROP TABLE public.personel_dogum_tarihi;
CREATE TABLE public.personel_dogum_tarihi
(
id integer,
dogum_tarihi date,
p_id integer,
CONSTRAINT aa FOREIGN KEY (p_id)
REFERENCES public.personel (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE
)
Yukarıdaki personel_dogum_tarihi tablomuzu oluştururken CONSTRAINT kısmında Foreign key oluşturulacağını belirtiyoruz bunu belirtirken de ON UPDATE ve ON DELETE komutları da devreye giriyor. personel_dogum_tarihi tablosunda ON DELETE CASCADE parametresi kullanılmıştır.
Bu parametre ile personel tablosunda kayıt silindiğinde personel_dogum_tarihi tablosunda da ilgili kaydı silecektir.
ON UPDATE ve ON DELETE komutları aşağıdaki parametreleri alarak kullanılabilir.
- SET NULL
- SET DEFAULT
- NO ACTION
- CASCADE
- RESTRICT
Yukarıdaki parametreler ile personel delete veya update yapıldığında personel_dogum_tarihi tablosunda null değer olsun, kolonun default değeri alınsın gibi işlemleri yapmak için kullanılır.
Bunları örnek yaparak pekiştirelim.
İlk olarak oluşturduğumuz tablolara veri yükleyelim.
INSERT INTO public.personel(
id, isim, adres, tckimlikno, "maaş")
VALUES (1, 'faruk', 'erdem', '11245676866', 1);
INSERT INTO public.personel_dogum_tarihi(
id, dogum_tarihi, p_id)
VALUES (1, '1991-08-30', 1);
INSERT INTO public.personel(
id, isim, adres, tckimlikno, "maaş")
VALUES (2, 'ayse', 'aa', '11225675866', 2);
INSERT INTO public.personel_dogum_tarihi(
id, dogum_tarihi, p_id)
VALUES (2, '1991-07-30', 2);
Verilerimizi insert ettikten sonra aşağıdaki şekilde personel tablomuzdan kayıt silelim ve personel doğum tarihi tablosundan da silinmiş mi görelim.
delete from personel where id=2
Personel tablomuzu sorguladığımızda verinin silindiğini görüyoruz.
Yukarıda görüldüğü gibi personel_dogum_tarihi tablosunu kontrol ettiğimizde ikinci kaydın buradan da silindiğini görmekteyiz.