[ misk0 @ 29.10.2005. 11:17 ] @
Imam tabele orders i orders_desc. Odnose se kao master-detail.
Tabela orders ima session_id polje koje ulazi u uslov po kojem brishem recorde.
Tabela orders_desc ima polje order_id kojim je povezana sa orders.id poljem.
Da li je moguce jednim query-jem obrisati recorde iz obe tabele?
Problem je sto orders tabela nema UVIJEK recorde u orders_desc.

Ja sam to rijesio sa 2 query-ja

Code:

DELETE ss_temp_order_desc FROM ss_temp_order_desc as t1, ss_temp_orders as t2 WHERE t1.order_id = t2.id and t2.session_id = '1ca382cec952f9428216b5970a003301'



DELETE ss_orders WHERE session_id='1ca382cec952f9428216b5970a003301'


Moze li stati u jedan?
[ Riste Pejov @ 29.10.2005. 20:10 ] @
u prethodnjem postu si rekao da je to MySQL? Dali mozda zelis reci koja je to verzija?

btw, najbolje resenje je da imas InnoDB tabele i foreign key za master detail vezu sa cascade delete pravilom. Taka kada obrises master record, onda ti MySQL automatski obrise i detail recorde.

[ _owl_ @ 29.10.2005. 20:41 ] @
Code:

DELETE FROM tabela1, tabela2 WHERE ...

Mada ovo ne radi na svim verzijama MySQL-a (radi na 4.1.x), uglavnom pogledaj FM za tvoju verziju kakva je sintaksa DELETE komande.

edit:sredjen code tag

[Ovu poruku je menjao _owl_ dana 30.10.2005. u 02:20 GMT+1]
[ misk0 @ 29.10.2005. 21:30 ] @
moze tako, medjutim imam WHERE gdje je order.session='4343443ffsd4' and order.id = order_desc.order_id.
To ce obrisati sve master recorde (i njihove details) koji imaju details, ukoliko ih nemaju, ostace master recordi.

ovo sa InnoDB bi mozda moglo proci, interesuje me samo, da li hosting servisi mozda zabrane InnoDB tip tabela? Hocu reci, da li ce to raditi na svim 4.x mySQL bazama?.
[ Riste Pejov @ 31.10.2005. 08:34 ] @
InnoDB je podrska je vec 3-4 godine stara, i novijim verzijama je po default aktivna tako da bi trebalo da je svi hosting podrzavaju, ali ipak, izuzeci su normalna pojava :-)
[ Dejan Topalovic @ 31.10.2005. 09:31 ] @
Code:
create table test1(id int(11), session_id varchar(32))

create table test2(id int(11), test1_id int(11), descr text)

insert into test1 values(1, 'session1');
insert into test1 values(2, 'session2');
insert into test1 values(3, 'session3');

insert into test2 values(1, 1, 'opis1');
insert into test2 values(2, 2, 'opis2');
insert into test2 values(3, 3, 'opis3');
insert into test2 values(4, 1, 'opis4');
insert into test2 values(5, 1, 'opis5');
insert into test2 values(6, 2, 'opis6');
insert into test2 values(7, 3, 'opis7');
insert into test2 values(8, 2, 'opis8');
insert into test2 values(9, 1, 'opis9');


mysql> select * from test1;
+------+------------+
| id   | session_id |
+------+------------+
|    1 | session1   |
|    2 | session2   |
|    3 | session3   |
+------+------------+
3 rows in set (0.03 sec)

mysql> select * from test2;
+------+----------+-------+
| id   | test1_id | descr |
+------+----------+-------+
|    1 |        1 | opis1 |
|    2 |        2 | opis2 |
|    3 |        3 | opis3 |
|    4 |        1 | opis4 |
|    5 |        1 | opis5 |
|    6 |        2 | opis6 |
|    7 |        3 | opis7 |
|    8 |        2 | opis8 |
|    9 |        1 | opis9 |
+------+----------+-------+
9 rows in set (0.00 sec)

mysql> select * from test1 t1, test2 t2 where t2.test1_id = t1.id and t1.session_id = 'session1';
+------+------------+------+----------+-------+
| id   | session_id | id   | test1_id | descr |
+------+------------+------+----------+-------+
|    1 | session1   |    1 |        1 | opis1 |
|    1 | session1   |    4 |        1 | opis4 |
|    1 | session1   |    5 |        1 | opis5 |
|    1 | session1   |    9 |        1 | opis9 |
+------+------------+------+----------+-------+
4 rows in set (0.00 sec)

insert into test1 values(4, 'session bez detail recorda');

DELETE FROM test1.*, test2.* 
USING test1 
LEFT JOIN test2 
ON test2.test1_id = test1.id 
WHERE (test2.id IS NULL OR test2.id IS NOT NULL) 
AND test1.session_id = 'session bez detail recorda';


Samo zamijeni nazive tabela i polja...

Edit: Preuredjen code, radi bolje preglednosti...

[Ovu poruku je menjao StRiPy dana 31.10.2005. u 15:53 GMT+1]
[ broker @ 31.10.2005. 11:24 ] @
Ne zaboravi da koristis transakciju u celoj stvari za ne daj boze.
[ misk0 @ 31.10.2005. 13:51 ] @
thx Stirpy, JOIN sam malo koristio tako da mi i nije pao na pamet.. I'll try

brooker: mySQL 4.1 koliko znam nema transakcije, 5ica ima, ali zasto? sta se moze desiti ruzno?

[Ovu poruku je menjao misk0 dana 31.10.2005. u 14:52 GMT+1]
[ broker @ 31.10.2005. 23:06 ] @
http://dev.mysql.com/doc/refma...en/transactional-commands.html

Zasto ti je to potrebno?

Ako oradis neku obradu podataka koja podrazumeva da se vise obrada mora tretirati kao jedna, onda transakcija upravo to i obezbedjuje: kada pokrenes vise obrada u istoj transakciji, uvek mozes da prekines obrade time sto ces prekinuti transakcije i vratiti stanje u bazi koje je bilo na pocetku transakcije, znaci pre svih obrada koje pripadaju toj transakciji. Time cuvas integritet podataka. Siguran sam da i sam mozes lako zamisliti kakav rsum u bazi moze da se desi ako se niz obrada prekine u sred posla a ne postoji nacin da se obrade ili dovrse ili poniste.

[ Riste Pejov @ 01.11.2005. 07:53 ] @
Pa covek koliko je rekao, ne koristi InnoDB tabele ... tako da transakcije su van diskusije. A ako koristi InnoDB onda svaki SQL statement je implicitna transakcija ... a posto nam je stripy pokazao da se moze u MySQL obrisati jednom SQL naredbom iz dve tabele tako da ukoliko covek koristi traksakcione MySQL tabele on automatski ima transakciju. Jedino explicitne transakcije trebaju ako zelis grupirati dva ili vise SQL statementa.

[Ovu poruku je menjao Riste Pejov dana 01.11.2005. u 08:54 GMT+1]
[ misk0 @ 01.11.2005. 08:32 ] @
Nemam toliko operacija nad bazom da imam potrebe za transakcijama. Rijec je o webshopu i uglavnom radim insert novih podataka.
U svakom slucaju hvala, a vjerovanto cu danas stici probati ovo sto je stripy napisao.
[ misk0 @ 07.11.2005. 16:12 ] @
Citat:
stripy:
WHERE (test2.id IS NULL OR test2.id IS NOT NULL)


a zasto ovaj uslov?
[ Dejan Topalovic @ 08.11.2005. 14:03 ] @
Moze i bez toga. :)
Ostalo izgleda prilikom testiranja nekih drugih kombinacija upita...
Je l' radi ovo rjesenje?