Tablolari Yeniden Duzenlemek :
Simdiye kadar olan kisimda veritabani ve tablolarin olusturulmasini inceledik.Cok mukemmel olmasa bile verilen gorevi yerine getirecek sekilde bir veritabani ve tablo dizayni yapmaya calistik.Gelecek te bu tablolarin sizin ihtiyaclariniza cevap vermedigini dusundugunuzde be yapacaksiniz?
Bugunku makalemizde tablolar ile yapilacak yeniden duzenleme islemlerini ineceleyecegiz.MySQL veritabani sistemi bize tablolari duzenlemek icin ALTER TABLE komutunu sunmaktadir.Bu komut ile
# Yeni tablo alanlari eklemek veya silmek, (ADD ve _DROP)
# Varolan tablo yapisini degistirmek,(ALTER,CHANGE ve MODIFY)
# Tablo alanlarinin isimlerini degistirmek,(CHANGE) veya tablonun adini degistirmek,(RENAME AS)
Ornegin "test" isimli bir tablonun adini "testedildi" olarak degistirmek isterseniz : (Once "ornek_db" isimli calisma veritabanimizda "test" isimli tablomuzu yaratalim.)
mysql> CREATE TABLE test (alan1 CHAR(40), alan2 INT);
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW TABLES;
+--------------------+
| Tables_in_ornek_db |
+--------------------+
| erisim |
| kullanicilar |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql>
Simdi "test" isimli tablonun adini "testedildi" olarak degistirelim :
mysql> ALTER TABLE test RENAME AS testedildi;
Query OK, 0 rows affected (0.11 sec)
mysql> SHOW TABLES;
+--------------------+
| Tables_in_ornek_db |
+--------------------+
| erisim |
| kullanicilar |
| testedildi |
+--------------------+
3 rows in set (0.00 sec)
mysql>
Not : "AS" anahtar kelimesi opsiyoneldir.Ayni komut "AS" anahtar kelimesi olmadan da asagidaki gibi kullanilabilir :
ALTER TABLE test RENAME testedildi;
Simdi tablomuza ENUM bir alan ekleyelim.ENUM alan yanlizca daha onceden belirlenmis seceneklerin birisinin veri olarak alana eklenebildigi tablo alani cinsidir.Boylece ornegin "Erkek" ve "Kadin" olarak belirlenmis iki secenekten birisnin alana veri olarak girilmesini istiyorsaniz tablo alanini asagidaki gibi ENUM olarak tanimlayarak soruna bir cozum getirebiliriz : (Daha onceden yarattigimiz "kullanicilar" tablosuna "cinsiyet" isimli bir alan ekleyip, o alani ENUM olarak tanimliyorum.ENUM seceneklerini de giriyorum.Erkek icin "E" ve Kadin icin "K" olarak iki secenegimiz var.Alan icin NULL veri girilmeye calilisildiginda DEFAULT deger bu alana atanacak.Bu DEFAULT degeride "E" olarak sectim.)
mysql> ALTER TABLE kullanicilar ADD cinsiyet ENUM('E', 'K') DEFAULT 'E';
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Simdi "kullanicilar" tablosunun son haline bir goz atalim : (Bunun icin ingilizcedeki "DESCRIBE" kelimesinin kisaltilmisi olan "DESC" komutu kullanilir.DESCRIBE ingilizcede "aciklama" anlamina gelir.Direkt olarak kisaltma yapmadan da "DESCRIBE" komutunu kullanabilirsiniz.)
......
.............
|
| sonerisim | timestamp(14) | YES | | NULL |
|
| cinsiyet | enum('E','K') | YES | | E |
|
+-------------------+--------------------+------+-----+------------+------------
----+
10 rows in set (0.00 sec)
Not: Yeni ekledigimiz tablo alani tablonun sonuna eklendi.Eger belirli bir siralama icerisinde yeni alani,olan herhangi bir alandan sonra gelecek sekilde koymak isterseniz "AFTER" anahtar kelimesini kullanabilirsiniz."After" ingilizcede "sonra" anlamina gelir.
Simdi yeni yarattigim alani kaldiriyorum ki onu belirli bir alandan sonra gelecek sekilde yaratbiliyim :
mysql> ALTER TABLE kullanicilar _DROP cinsiyet;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Artik cinsiyet adindaki tablo alanimiz kaldirildi.
Simdi "cinsiyet" isimli alani "kullaniciadi" alanindan sonra gelecek sekilde yaratayim :
mysql> ALTER TABLE kullanicilar ADD cinsiyet ENUM('E', 'K') DEFAULT 'E' AFTER gercekadi;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Simdi tablonun yapisina bir daha bakalim :
.....
..........
| gercekadi | varchar(30) | | | |
|
| cinsiyet | enum('E','K') | YES | | E |
.............
.......
Eger yeni ekleyeceginiz alani tablonun en basina yerlestirmek istiyorsaniz "FIRST" anahtar kelimesini kullanabilirsiniz.Ingilizcede First "Ilk" anlamina gelir.
Ornegin sitenizi daha cok kadin ziyaretciler geziyor ise DEAFULT degeri 'K' olarak degistirmek daha mantikli olacaktir :
mysql> ALTER TABLE kullanicilar ALTER cinsiyet SET DEFAULT 'K';
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Tablo alaninin yapisini oldugu gibi komple degisitmek istiyorsaniz "MODIFY" anahtar kelimesini kullaniniz : (Modify ingilizcede "duzenle" anlamindadir.)
mysql> ALTER TABLE kullanicilar MODIFY profil VARCHAR(250) NOT NULL
-> DEFAULT 'Profil girisi yapilmamis';
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Eger tablo alaninin ismini de yapisini da degistirmek istiyorsaniz "CHANGE" anahtar kelimesini kullaniniz : (Change ingilizcede "degistir"anlamindadir.)
mysql> ALTER TABLE kullanicilar CHANGE ulkesi milliyeti VARCHAR(50) NOT NULL;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Bir tabloya Indeks ve Primary Key ekleyip dusurmek gene ayni sekilde cok kolaydir :
mysql> ALTER TABLE kullanicilar ADD INDEX (kayittarihi);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> ALTER TABLE kullanicilar _DROP _INDEX kayittarihi;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
PHP icerisinden yukarida anlatilan SQL yapilarini kullanmak daha da kolaydir :
mysql_query ("ALTER TABLE kullanicilar _DROP _INDEX kayittarihi");
seklinde bir yapi ile sorgunuzu (herhangi bir gecerli SQL sorgusu olabilir) veritabani uzerinde PHP kullanarak uygulayabilirsiniz.
Tabloya Veri Yerlestirmek
Temel olarak SQL komutlari ile tablo icerisinde verileri yonetmeyi ogrenmeden PHP ile bu isin nasil yapilacgina girmeyecegiz.Bu nedenle Temel SQL komutlari ile MySQL istemcisinden bu islemleri gerceklestirmeye ardindan HTML formlari ile alinan verilerin, PHP kodlari ve SQL sorgulari kullanilarak, MySQL veritabani tablolarina nasil eklenecegini inceleyecegiz...
Bir veriyi tabloya eklemek icin "INSERT" anahtar kelimesi kullanilir :
mysql> INSERT INTO erisim VALUES('/giris.html', 'serkan', 0, NULL);
Query OK, 1 row affected (0.11 sec)
mysql> SELECT * FROM erisim WHERE kullaniciadi = 'serkan';
+-------------+--------------+---------------+----------------+
| sayfa | kullaniciadi | ziyaretsayisi | erisimtarihi |
+-------------+--------------+---------------+----------------+
| /giris.html | serkan | 0 | 20010915155545 |
+-------------+--------------+---------------+----------------+
1 row in set (0.11 sec)
mysql>
Not : Eger duzyazi bir veri yerlestiriyorsaniz (string veri) onu tirnak isaretinin icerisinde yazmalisiniz.
Yukaridaki yazilis sekli ile tablodaki butun alanlara karsilik gelecek verileri girmelisiniz.Biz erisim tarihi icin NULL verisi kullanarak gecerli tarih ve zamanin "YYYYAAGGssddss" formatinda otomatik olarak "erisimtarihi" alanina eklenmesini sagladik.
Eger tablo alanlarinin tamami yerine bir kismina veri giriyorsaniz yukaridaki yazim seklinden biraz uzaklasmaniz gereklidir :
mysql> INSERT INTO erisim (sayfa,kullaniciadi,ziyaretsayisi) VALUES('/index.html', 'oktay', 1);
Query OK, 1 row affected (0.00 sec)
mysql>
Simdi tablomuzdaki verilere goz atalim :
mysql> SELECT * FROM erisim;
+-------------+--------------+---------------+----------------+
| sayfa | kullaniciadi | ziyaretsayisi | erisimtarihi |
+-------------+--------------+---------------+----------------+
| /giris.html | serkan | 0 | 20010915155545 |
| /index.html | oktay | 1 | 20010915160511 |
+-------------+--------------+---------------+----------------+
2 rows in set (0.00 sec)
mysql>
Goruldugu gibi bazi alanlara girilecek veriyi belirtmedigimiz halde DEFAULT degerler o alanlara eklendi.
Verilerin icinde gecen tirnak isaretlerini ele almak:
Verilerin icinde gecen tirank isaretlerini bir sekilde etkisiz hale getirmelisiniz.Bunu basaramaz iseniz hatalarla karsilasir ve verilerinizi tabloya ekleyemezsiniz :
mysql> INSERT INTO kullanicilar (profil)
-> VALUES('Ben PHP'nin Sevdalisiyim.');
'>
'>
'> ';
ERROR 1064: You have an error in your SQL syntax near 'nin Sevdalisiyim.');
'' at line 2
mysql>
Verinin icindeki tirank isaretlerini etkisiz hale getirmek icin "\" ters bolu isareti kullanilir.Ornek vermek gerekirse :
mysql> INSERT INTO kullanicilar (profil) VALUES('Ben PHP\'nin Sevdalisiyim.');
Bazen cift tirnak isaretleri kullanilarak da verinin icindeki tirnak isaretleri etkisiz hale getirilebilir :
mysql> INSERT INTO kullanicilar (profil) VALUES("Ben PHP'nin Sevdalisiyim.");
Unutmayin, tirnak isaretlerini etkisiz hale getirmek icin kullanilan "\" ters bolu isareti ayni zamanda DOS/Windows sistemlerinde suruculeri gostermek icin de kullanilir.Bu durumda asagidaki sekilde ters bolu isaretinin kendisini de etskisiz hale getirmek icin basina bir ters bolu isareti daha eklenir :
mysql>INSERT INTO kullanicilar (profil) VALUES ("C:\\Program Files\\PHP");
Eger PRIMARY KEY olarak tanimladiginiz alanda yer alan bir verinin aynisini girmeye kalkarsaniz asagidaki gibi bir hata mesaji alirsiniz :
mysql> INSERT INTO kullanicilar (kullaniciadi,profil)
-> VALUES ('serkan', 'Ben PHP\'nin sevdalisiyim.');
ERROR 1062: Duplicate entry 'serkan' for key 1
mysql>
Yukarida gorulen hata mesajinda MySQL, veriyi koymak istediginiz alanin PRIMARY KEY olarak tanimlanmis olmasindan dolayi ayni verinin farkli iki satirda yer almasinin mumkun olmadigindan sikayet etmektedir.Unutmayin, her satirdaki veri setini tanimlamak icin bir tablo alanini PRIMARY KEY olarak tanimliyoruz.Boylece o satirdaki veriyi,veritabaninin diger tablolarinda kullanmak ve o veriyle iliski kurmak mumkun oluyor.Bu nedenle PRIMAY KEY olarak tanimlanmis bir alanda daha onceden "serkan" verisi yaziyorsa siz baska bir satirda gene o alan icin "serkan" verisini giremezsiniz.Bunu yapmaniza MySQL engel olur.PRIMARY KEY olarak tanimlanmis alanda butun tablo icerisinde o alandaki butun veriler essiz olmalidir.
Bununla beraber siz o alandaki veriyi degistirrmek istiyor olabilirsiniz.Bunu yapmak icin asagidaki gibi bir yazim kullanmalisiniz.
MySQL icerisinde bir alandaki veriyi degistirmek icin REPLACE anahtar kelimesi kullanilir :
mysql> REPLACE INTO kullanicilar (kullaniciadi,profil)
-> VALUES ('serkan','Ben PHP\'nin sevdalisiyim.');
Query OK, 1 rows affected (0.00 sec)
mysql>
REPLACE anahtar kelimesi kullanildiginda olan verinin uzerine yazilir.
Hazilanan Tablolara Veri Girmek
Simdi tablomuzu ve alanlarimizi basarili bir sekilde olusturdugumuza gore bir kac ornek veri girebiliriz :
mysql> INSERT INTO kullanicilar VALUES(
-> NULL,
-> 'tayfun',
-> password('12345'),
-> 'Tayfun ULU',
-> 'E',
-> 'Turkiye Cumhuriyeti',
-> 'tayfun@turk-php.com',
-> 'Bir PHP Programcisi.',
-> '1999-01-01',
-> '20000825140152');
Query OK, 1 row affected (0.00 sec)
mysql>
Sifre alani icin MySQL hazir fonksiyonu olan password () kullandik.Bu konu ile ilgili detayli aciklamalari sonraki yazilarimizda yapacagiz.
Nornmalde curdate () hazir fonksiyonu kullanilarak da kayittarihi ve sonerisim alanlari icin gerekli tarih verilerini yaratabilirdik.Biz burada veriyi dogrudan kendimiz girdik...
kullanicinumarasi alani icin NULL veri girdim.Bu durumda o alan AUTO_INCREMENT olarak tanimli oldugu icin bir onceki kayidin numarasinin bir ustu numara, otomatik olarak o alana veri olarak eklendi.