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:
Yukarıdaki ifadeler sadece belirtilen alanın özelliklerini tanımlamaktadır. Tüm tablonun özelliklerini belirtmek için ise şunlar kullanılır.
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 | 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.
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:
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.
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