Yazdır 07 Haziran 2010 Pazartesi (Hit: 81917)

Tablo Oluşturma (create table)

Gerçek sunucularda kullanılacak olan veritabanı bizlere verilen kontrol paneli üzerinden oluşturulmaktadır. Oluşturulan veritabanında kullanılacak tablolar ise çoğu zaman SQL komutları ile oluşturulur. Tabloları oluşturacak olan tüm SQL komutları genellikle setup.php yada install.php sayfasına yazılır ve bu sayfalar çalıştırılıp tablolar oluşturulur. Dolayısıyla site veritabanı kurulmuş olur.

Öncelikli amacımız temel SQL komutlarını öğrenmek, sonraki amacımız ise bu komutları php ile kullanıp veritabanı işlemlerini gerçekleştirmektir.

Seçilen veritabanında tablo oluşturmak için şu komut kullanılır.

create table tablo_adi (alan1 özellikleri, alan2 özellikleri, alan3 özellikleri, ....);

Kayıtlara ait ortak bilgilerin tablolardaki alanlarda saklandığını söylemiştik. Bu alanların veritürleri ve özellikleri tablo oluşturulurken belirtilmelidir. Veri türlerini önceki yazınızda anlatmıştık. Alanlarda kullanılan özellikleri ise şunladır:

  • null > alanın boşbırakılacağını
  • not null > alanın boş bırakılamayacağını
  • signed > sayının işaretli olacağını
  • unsigned > sayının işaretsiz olacağını
  • primary key > alanın birincil anahtar olacağını (benzersiz değere sahip olacağını)
  • auto_increment > sayının otomatik artacağını
  • default > alanın vasayılan değerini
  • character set > alanda kullanılacak karakter setini tanımlamaktadır.


Yukarıdaki ifadeler sadece belirtilen alanın özelliklerini tanımlamaktadır. Tüm tablonun özelliklerini belirtmek için ise şunlar kullanılır.

  • foreign key > Tablolar arasında ilişkili alanlar oluşturmak için (sadece InnoDB depolama motoru için)
  • character set > Tüm tablonun karakter setini belirtmek için
  • type > Tabloda kullanılacak depolama motorunu tanımlamak için kullanılır.


Depolama Motorları

Tablolarda kayıt saklamak için çeşitli depolama algoritmaları kullanılır. Bunlar depolama motoru olarak tanımlanmaktadır. MySQL'de varsayılan depolama motoru MyISAM motorudur. Eğer aralarında ilişki bulunan tablolar kullanmak isterseniz InnoDB depolama moturunu kullanmalısınız. Tabiki size hizmet veren sunucunu bunu destekleyip desteklemediğini phpMyAdmin web arayüzündeki Motorlar başlığına bakarak anlayabilirsiniz.

 

 

Örnek: Aşağıdaki tabloyu uyeler adıyla oluşturan SQL komutunu yazalım.

id k_adi sifre dogum_yili cinsiyeti giris_sayisi
-mediumint
-işaretsiz
-birincil anahtar
-otomatik
-boş değil
-En fazla 12 karakter
-boş değil
-En fazla 10 karakter
-boş değil
-YYYY biçiminde yıl -Tek karakter
-varsayılan olarak 'e'
-int
-işaretsiz

 

create table uyeler(
id mediumint unsigned primary key auto_increment not null,
k_adi varchar(12) not null,
sifre varchar(10) not null,
dogum_yili year,
cinsiyeti char(1) default 'e',
giris_sayisi int unsigned
) character set utf8 collate utf8_general_ci type=MyISAM;



Örnek: Yazılara ait yorumların saklanabileceği aşağıdaki tabloyu yorumlar adıyla oluşturan SQL komutunu yazalım.

id adi_soyadi email yazi_id yorum tarih
-smallint
-işaretsiz
-birincil anahtar
-otomatik -boş değil

 

-en fazla 30 karakter
-boş değil
-en fazla 30 karakter -smallint
-işaretsiz
-boş değil
-tinytext
-boş değil
-date
-boş değil
create table yorumlar(
id smallint unsigned primary key auto_increment not null,
adi_soyadi varchar(30) not null,
email varchar(30),
yazi_id smallint unsigned not null,
yorum tinytext not null,
tarih date not null
) character set utf8 collate utf8_general_ci type=MyISAM;

 

Örnek: Web sayfasında üstteki yatay menülerin alt menüsü olacak altmenuler isimli aşağıdaki tabloyu oluşturan SQL komutunu yazalım.

id baslik yazi_id ustmenu_id sira aciklama
-tinyint -işaretsiz
-otomatik
-birincil anahtar
-boş değil
-en fazla 40 karakter
-boş değil
-smallint
-işaretsiz
-boş değil
-tinyint
-işaretsiz
-boş değil
-tinyint
-işaretsiz
-tinytext
create table altmenuler(
id tinyint unsigned auto_increment primary key not null,
baslik varchar(40) not null,
yazi_id smallint unsigned not null,
ustmenu_id tinyint unsigned not null,
sira tinyint unsigned default 0,
aciklama tinytext
) character set utf8 collate utf8_general_ci type=MyISAM;

 

Örnek: Aşağıdaki kayıtları barındırabilecek subeler tablosunu oluşturan SQL komutunu yazalım.

sube_kodu sube_adi
10blsa 10 Bilişim A
10blsb 10 Bilişim B
10andbls 10 Anadolu Bilişim
create table subeler (
sube_kodu varchar(10) primary key not null,
sube_adi varchar(30) not null
) character set utf8 collate utf8_general_ci type=MyISAM;

 

Örnek: Aşağıdaki kayıtları barındırabilecek talebeler tablosunu oluşturan SQL komutunu yazalım.

ogrenci_no adi soyadi cinsiyeti sube_kodu
54 Ahmet Özdemir e 10blsa
72 Zahid Koruk e 10blsa
71 Havva Demir k 10andbls
create table talebeler(
ogrenci_no smallint unsigned primary key not null,
adi varchar(15) not null,
soyadi varchar(15) not null,
cinsiyeti char(1) default 'e',
sube_kodu varchar(10) not null
) character set utf8 collate utf8_general_ci type=MyISAM;

Not: Burada öğrenciler açılmış olan bir sınıfa kaydedilebilir. Dolayısyla buradaki sube_kodu alanına subeler sınıfında tanımlı olan sube_kodu değerlerinden biri yazılabilir. Dolayısıyla bu iki alanın özellikleri dikkat ederseniz aynı yapılmıştır. ( sube_kodu varchar(10) not null )

 

Örnek: Aşağıdaki derslerin saklanabileceği mufredat isimli tabloyu oluşturan SQL komutunu yazalım.

ders_kodu ders_adi
mat Matematik
geo Geometri
ted Türk Dili ve Edebiyatı
create table mufredat (
ders_kodu varchar(10) primary key not null,
ders_adi varchar(20) not null
) character set utf8 collate utf8_general_ci type=MyISAM;

 

Örnek: Öğrenclerin notlarının saklanacağı karne isimli aşağıdaki tabloyu oluşturan SQL komutunu yazalım.

ogrenci_no ders_kodu yazili1 yazili2 sozlu ortalama
54 mat 40 60 80 60
72 geo 70 80 90 80
54 ted 40 50 60 50
71 mat 60 20 55 45
create table karne (
ogrenci_no smallint unsigned not null,
ders_kodu varchar(10) not null,
yazili1 tinyint unsigned default 0,
yazili2 tinyint unsigned default 0,
sozlu tinyint unsigned default 0,
ortalama float default 0,
primary key(ogrenci_no, ders_kodu)
) type=MyISAM;

Buradaki tablomuzda iki tane alan beraberce birincil anahtar olarak tanımlanmıştır. Bunun anlamı şudur: Beraberce girilen öğrenci no ve ders kodu bir daha girilemez. Yani öğrencinin bir dersten aldığı not bir kere girilebilir. Örneğin yukarıdaki tabloya göre 54 nolu öğrencinin mat dersinden aldığı notlar girilmiştir. Bir daha girilemez. (Girilememesi de gerekir.) Ancak 54 nolu öğrencinin başka bir dersinin notu yada başka bir öğrencinin mat notu girilebilir.

 

Tablo Silme

Seçili veritabından tablo silmek için drop table tablo_adi; komutu kullanılır.

Örnek: Sırasıyla uyeler, yorumlar, altmenuler, subeler, talebeler, mufredat, ve karne isimli tabloları silelim.

drop table uyeler;
drop table yorumlar;
drop table altmenuler;
drop table subeler;
drop table talebeler;
drop table mufredat;
drop table karne;

Dikkat: Kaldıralan tablodaki kayıtlar ve tablo geri alınamaz bir şekilde silinecektir.

 

Örnek: Bu örneğimizde aralarında ilişki bulunan 3 tablo oluşturacağız. Resimde de görüldüğü gibi hiyerarşik olarak en üstte bolumler tablosu vardır. Sonra sırasıyla kategoriler ve icerikler tabloları vardır. Bunun anlamı şudur:

  • Bir bölüm oluşturmadan o bölüm altında kategori açamazsınız.
  • Aynı şekilde bir kategori açmadan da bir içerik ekleyemezsiniz.

İlişkisel Tablolar

Bölümler ile kategoriler arasında 1-n ilişki vardır. Yani bir bölüm altında bir çok (n) kategori açılabilir. Ancak bir kategori yalnızca bir (1) bölüme ait olabilir.

Aynı şekilde kategoriler ile içerikler arasında da 1-n ilişki vardır. Bir kategori altında bir çok içerik olabilir. Ancak bir içerik sadece bir kategoriye ait olabilir.

Kategoriler tablosunda, kategorinin hangi bölüme ait olduğunu belirtmek için bolum_id alanı eklenmiştir. İçerikler tablosunda da, içeriğin hangi kategoriye ait olduğununu belirtmek için kategori_id alanı eklenmiştir. Tablolar arasındaki ilişki de zaten bu ortak alanlar ile yapılmaktadır. Tabloları oluşturken bu ortak alanların veri türleri ve özellikleri aynı olmalıdır.

  • Kategoriler tablosundaki bolum_id foreign key yani yabancı anahtardır.
  • İçerikler tablosundaki kategori_id alanı da foreign key yani yabancı anahtardır.

Yabancı anahtarın anlamı şudur: Bu alana girilebilecek değerler bağlı bulundukları üst tablodaki değerlerden biri olabilir. Dikkat ederseniz kategoriler tablosundaki bolum_id alanında bulunan değerler 1, 2, 2 dir. Bu değerler üst tabloda yani bölümler tablosundaki değerlerdendir.

Buradaki alanların veri türlerini ve özelliklerini sakladıkları değerlere göre kendimiz uygun bir şekilde ayarlarak tablolarımızı oluşturmaya çalışalım.

create table bolumler (
bolum_id tinyint unsigned primary key auto_increment not null,
bolum_adi varchar(20) not null
) character set utf8 collate utf8_general_ci type=InnoDB;
create table kategoriler (
kategori_id smallint unsigned primary key auto_increment not null,
kategori_adi varchar(50) not null,
bolum_id tinyint unsigned not null,
aciklama tinytext,
foreign key(bolum_id) references bolumler(bolum_id) on update cascade on delete cascade
) character set utf8 collate utf8_general_ci type=InnoDB;
create table icerikler (
icerik_id smallint unsigned primary key auto_increment not null,
icerik_adi varchar(80) not null,
icerik text,
kategori_id smallint unsigned not null,
aciklama tinytext,
foreign key(kategori_id) references kategoriler(kategori_id) on update cascade on delete cascade
) character set utf8 collate utf8_general_ci type=InnoDB;

Burada on update cascade ifadesi güncelleme esnasında ilişkili tabloların da beraberinde güncellenmesi gerektiğini belirtmektedir. Örneğin; bölümler tablosundaki bir bölümün numarası değiştirildiğinde kategoriler tablosundaki ilgili numaralar da otomatik olarak değiştirilecektir. Aynı şekilde on delete cascade ifadesi ile de bir kayıt silindiğinde buna bağlı tüm alt kayıtlar da ard arda silinecektir. Örneğin; bölümler tablosundaki bir bölüm silindiğinde buna bağlı tüm alt kategoriler, bu kategorilere bağlı tüm alt içerikler silinecektir. Aslında bu ifade çok tehlikelidir. Yanlışlıkla bir bölüm silinirse tüm alt ilişkileri de silinir. Siz siz olun bunu kullanmadan önce iyice düşünün. Biz burada nasıl kullanıldığını göstermek için yazdık.

Bu arada bu tabloları kaldırmak için (drop table) hiyerarşik olarak en alttan başlamanız gerekmektedir. Yani önce içerikler, sonra kategoriler, en son olarak da bölümler tablosunu silebilirsiniz.

drop table icerikler;
drop table kategoriler;
drop table bolumler;

 


Bu site meslek liselerinde bilişim bölümü web programcılığı dalında okutulan internet programcılığı dersine yardımcı olması için tasarlanmıştır. İletişim için iletisim@phpdefteri.com
Apache PHP MySQL PhpMyAdmin EasyPHP Xampp AppServ Wamp W3School

www.phpdefteri.com © 2010