[ glamoc @ 25.08.2010. 14:30 ] @
Koristim mySql bazu za neku web aplikaciju koju radim u php(Zend) i imam dve tabele, tabela "user" i tabela "categories".U tabeli "user" izmedju ostalih nalazi se i
polje "user_username",i to polje sam uvezao u tabelu "categories" i to na sledeci nacin
FOREIGN KEY(`user_username`) references user(`user_username`)ON UPDATE CASCADE ON DELETE CASCADE
Mislio sam da cu ovim postici da iz aplikacije nije moguce u polje "user_username" tabele "categories" ubaciti nijednu vrednost koja se ne nalazi u polju "user_username" tabele "user" ali to nije slucaj.Interesuje me kako da postignem takvo ponasanje
[ bogdan.kecman @ 25.08.2010. 15:08 ] @
hint1: nemoj da prenosis text polja kroz tabele, prenosi ID (4 bajta umesto "mnogo" bajtova, mnoooogo je brze, indexi su manji, zauzima manje mesta na disku u kesevima u ramu ..)
hint2: da li su ti tabele innodb?
hint3: kada postavljas pitanje zgodno je da odma stavis rezultat od "show create table imetabele\G" kako ne bi gubili vreme na "podpitanja"

priprema
Code:

drop table if exists t2;
drop table if exists t1;
create table t1 (id int auto_increment primary key not null, name char(10), index i_name(name)) engine=innodb;
create table t2 (id int auto_increment primary key not null, t1name char(10), index x(t1name), 
foreign key (t1name) REFERENCES t1(name) ON UPDATE CASCADE ON DELETE CASCADE) engine=innodb;
insert into t1 (name) values ('pera'), ('zika'), ('laza');


i kako to na kraju izgleda:

Code:

mysql> insert into t2 (t1name) values ('pera');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 (t1name) values ('zika');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t2 (t1name) values ('laza');
Query OK, 1 row affected (0.02 sec)

mysql> insert into t2 (t1name) values ('laza');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 (t1name) values ('laza');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 (t1name) values ('mika');
ERROR 1452 (23000): Cannot add or update a child row: 
  a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`t1name`) 
  REFERENCES `t1` (`name`) ON DELETE CASCADE ON UPDATE CASCADE)
mysql>


kao sto vidis ne moze da se ubaci vrednost koja ne postoji u t1 - to je to sto si trazio ... problem je u tome sto da bi to radilo tabele moraju da budu InnoDB, myisam to ne podrzava
[ glamoc @ 26.08.2010. 11:58 ] @
E hvala na odgovoru ovo radi.
Iskreno receno skorije sam se poceo ozbiljnije raditi sa bazama i ovaj tvoj primer me je naucio dosta stvari.
Eksperimentisao sam sa ovim tabelama sto si mi poslao i primetih da kad izostavim index-e iz tvoje tabele da nece ni da kreira tabelu t2(engine innodb),tj.javi gresku:
Code:
#1005 - Can't create table 'blogsys.t2' (errno: 150)


pa ako mozes da mi kazes sta je u pitanju, i za koja polja treba definisati i indekse u tabelama


[ bogdan.kecman @ 26.08.2010. 14:47 ] @
Citat:
glamockad izostavim index-e iz tvoje tabele da nece ni da kreira tabelu


ne mozes da referenciras
Code:

foreign key (t1name) REFERENCES t1(name) ON UPDATE CASCADE ON DELETE CASCADE)


ako t1.name nije indexiran

Citat:
glamocpa ako mozes da mi kazes sta je u pitanju, i za koja polja treba definisati i indekse u tabelama


definises indexe tamo gde ti trebaju, pitanje je malo preopsirno