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.
Bu yazi ile ilgili tum soru,sorun veya dusuncelerinizi gene
bu makalenin altinda yer alan "Bu konu hakkinda ne dusunuyorsunuz?"
baslikli alana yazabilir veya sorularinizi
http://turk-php.com/forum/ adresine tasiyabilirsiniz...
Serkan Hadi Ceylani
turk-php.com
serkan@turk-php.com