Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Brisanje slogova iz više tabela

[es] :: MySQL :: Brisanje slogova iz više tabela

[ Pregleda: 2148 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mish_ns
Miloš Krstin

Član broj: 159930
Poruke: 1105
*.dynamic.isp.telekom.rs.



+18 Profil

icon Brisanje slogova iz više tabela06.04.2013. u 10:12 - pre 134 meseci
pozdrav.

zanima me kako mogu da izbrišem slogove iz tri tabele...s tim što u dve znam sigurno da imam podatke za brisanje a u trećoj bih trebao da proverim da li postoji podatak sa tim id-om koji brišem...

recimo...

tabela 1
id broj rel
1 2004 5
2 2005 17

tabela 2
id broj vrs
1 2004 58
2 2005 69

tabela 3
id1 broj1 id2 broj2
18 2569 1 2004

E sad kada bih brisao podatak sa id=1, broj=2004 imao bih tri sloga za brisanje u sve tri tabele,
a kada bih brisao podatak sa id=2, broj=2005 imao bih 2 sloga za brisanje u prve dve tabele...

Da li je ovo moguće sa jednim upitom?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 10:19 - pre 134 meseci
http://dev.mysql.com/doc/refman/5.5/en/delete.html

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

...


 
Odgovor na temu

mish_ns
Miloš Krstin

Član broj: 159930
Poruke: 1105
*.dynamic.isp.telekom.rs.



+18 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 10:45 - pre 134 meseci
Hvala Bogdane...

Ovo mi jasno kada u dve (t1,t2) tabele imam podatak za brisanje, ali ako imam samo u jednoj tabeli, a u drugoj ne upit ne radi...

Citat:

These statements use all three tables when searching for rows to delete, but delete matching rows only from tables t1 and t2.


možda nisam dobro postavio pitanje...
Ako u sve tri tabele imam neki podatak hoću da ga brišem u sve tri, ali ako taj podatak nije u 3 tabeli onda upit treba da radi samo nad 1,2 tabelom...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 11:14 - pre 134 meseci
delete t1, t2, t3, t4 from t1,t2,t3,t4 where ...

?

sta znaci "nemas u trecoj tabeli", u tabelama u kojima nemas podatak za uslov u where nista nece biti obrisano, isto je i ako imas samo jednu tabelu, sta je nejasno?
 
Odgovor na temu

mish_ns
Miloš Krstin

Član broj: 159930
Poruke: 1105
*.dynamic.isp.telekom.rs.



+18 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 11:44 - pre 134 meseci
Hmmm...
Nije mi jasno jer, i jedan i drugi upit brišu podatke samo kada imam u sve tri tabele neki id...
A kada imam u dve tabele, a u trećoj ne onda se ne briše ništa
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 11:50 - pre 134 meseci
aj daj create i upit i sta ne radi sta radi posto se nesto ne razumemo, isto kao sto bi ti radio select radi i delete
 
Odgovor na temu

mish_ns
Miloš Krstin

Član broj: 159930
Poruke: 1105
*.dynamic.isp.telekom.rs.



+18 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 12:11 - pre 134 meseci
Code:
CREATE TABLE `dokument_glava` (
  `id_glava` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `broj` int(6) unsigned zerofill NOT NULL,
  `rel_id_dok` mediumint(3) unsigned NOT NULL,
  `rel_id_kupac` int(4) unsigned zerofill NOT NULL,
  `datum` date NOT NULL,
  `pdv` decimal(4,2) unsigned NOT NULL,
  `id_val` int(1) unsigned NOT NULL COMMENT 'id valute',
  `kurs` decimal(8,4) unsigned NOT NULL,
  `napomena` varchar(300) NOT NULL,
  `rok_placanja` int(4) unsigned NOT NULL,
  PRIMARY KEY (`id_glava`)
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8


Code:
CREATE TABLE `dokument_stavke` (
  `redni_broj` int(10) unsigned NOT NULL,
  `broj` int(6) unsigned zerofill NOT NULL,
  `rel_id_dok` mediumint(3) unsigned NOT NULL,
  `rel_id_proizvod` int(5) unsigned NOT NULL,
  `kolicina` decimal(8,2) unsigned NOT NULL,
  `cena_jm` decimal(10,2) unsigned NOT NULL,
  `rel_id_mere` int(1) unsigned NOT NULL,
  `rabat` decimal(4,2) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8


Code:
CREATE TABLE `veza_dokumenata` (
  `rel_id_dok` int(3) unsigned NOT NULL,
  `broj` int(6) unsigned NOT NULL,
  `rel_drugi_dok` int(3) unsigned NOT NULL,
  `broj_drugi_dok` int(6) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8


E ovo je konkretan primer...

Broj i rel_id_dok u prve dve tabele moram imati... treca mi je za vezu između dokumenata...

Upit:
Code:
DELETE dokument_glava.*, dokument_stavke.*, veza_dokumenata.* FROM dokument_glava,dokument_stavke,veza_dokumenata
WHERE dokument_glava.broj = dokument_stavke.broj AND dokument_glava.rel_id_dok = dokument_stavke.rel_id_dok
AND dokument_glava.broj = veza_dokumenata.broj_drugi_dok AND dokument_glava.rel_id_dok = veza_dokumenata.rel_drugi_dok
AND dokument_glava.broj=130004 AND dokument_glava.rel_id_dok=100;


 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 12:34 - pre 134 meseci
daj i neki insert :)

probaj isti taj upit samo select, obrati paznju da radis inner join implicitno, mozda ti treba drugi tip joina, ja moram da idem sad da zakovim par h ako ne resis videcemo kad se vrnem medju zive
 
Odgovor na temu

mish_ns
Miloš Krstin

Član broj: 159930
Poruke: 1105
*.dynamic.isp.telekom.rs.



+18 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 13:04 - pre 134 meseci
Ne vredi, razdvojio sam na kraju na 2 delete-a i sad radi....
Ako budeš imao neku ideju javi...

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela06.04.2013. u 20:25 - pre 134 meseci
imas nesto and nesto and nesto and nesto ... ako bilo koji "nesto" nije tacan ceo result je netacan, ako bilo koji nesto ubada "null" nista nije tacno, takodje, sa inner join koji radis implicitno ako je nesto null onda ne moze da bude ni deo result set-a.

dakle ideja je da napravis SELECT koji vraca rezultate koje oces da brisnes i onda samo butnes delete umesto select
 
Odgovor na temu

mish_ns
Miloš Krstin

Član broj: 159930
Poruke: 1105
*.dynamic.isp.telekom.rs.



+18 Profil

icon Re: Brisanje slogova iz više tabela08.04.2013. u 06:21 - pre 134 meseci
Citat:
bogdan.kecman: imas nesto and nesto and nesto and nesto ... ako bilo koji "nesto" nije tacan ceo result je netacan, ako bilo koji nesto ubada "null" nista nije tacno, takodje, sa inner join koji radis implicitno ako je nesto null onda ne moze da bude ni deo result set-a.


Totalno si u pravu... Kada nemam zapis u trecoj tabeli onda mi nista ne vraca...(to je ta varijanta sa SELECT-om)
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela08.04.2013. u 08:48 - pre 134 meseci
zato ti kazem probaj drugi tip join-a (npr LEFT OUTER JOIN )
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Brisanje slogova iz više tabela08.04.2013. u 08:58 - pre 134 meseci
Ja sam iz neke druge priče, pa možda zato ne vidim problem.
Šta fali da se uradi tri DELETE u jednoj transakciji umesto da se pišu monstruozni upiti?

http://php.net/manual/en/pdo.transactions.php

EDIT: Evo, sada sam malo pogledao i MySQL domumentaciju, postoji ON DELETE CASCADE deklaracija na FOREIGN KEY, bar u verziji 5.5 http://dev.mysql.com/doc/refma...b-foreign-key-constraints.html

[Ovu poruku je menjao djoka_l dana 08.04.2013. u 10:39 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela09.04.2013. u 01:05 - pre 134 meseci
Citat:
djoka_l: Ja sam iz neke druge priče, pa možda zato ne vidim problem.
Šta fali da se uradi tri DELETE u jednoj transakciji umesto da se pišu monstruozni upiti?


prvo tu nista nije monstruozno, left outer join nije nikakav monstruozitet, samo ga pocetnici malo redje koriste, na zalost pocetnicima je obicno mnogo potrebniji

drugo, jedan delete koji pita iz tri tabele i brise u vise od jedne ce u 99% slucajeva biti 3x brzi od 3 uzastopna upita u istoj transakciji

sto se tice delete cascade, to zahteva referencijalni integritet jel, po ovome kako sam na brzinu video sta se kod op-a desava rekao bih da mu nije ispostovan ref.i. inace ne bi n iimao te null-ove
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Brisanje slogova iz više tabela09.04.2013. u 09:03 - pre 134 meseci
Monstruozna je sama činjenica da DELETE u MySQL briše iz više od jedne tabele. Nijedna krštena baza to ne radi. Verovatno je to ostatak iz MyISAM koji nije imao transakcionu obradu. Ako neko koristi InnoDB nema nikakvih razloga da koristi egzotičnu sintaksu koju podržava samo MySQL i nijedna druga baza na svetu.
Lepo uradadi tri DELETE naredbe u jednoj transakciji, pa onda sve to lepo komituje.
A to da DELETE sa JOIN nad tri tabele radi brže nego tri DELETE naredbe, to tek nema teorije da me ubediš.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela09.04.2013. u 10:58 - pre 134 meseci
Citat:
djoka_l: Monstruozna je sama činjenica da DELETE u MySQL briše iz više od jedne tabele. Nijedna krštena baza to ne radi.


niko te ne tera da to koristis :D a ne vidim da je to problem sto postoji ... jeste razlog postojanja toga u mysql-u to sto nekada davno nije bilo cascade delete pa je sintaksa zbog backwards compatibility zadrzana.... nista tu nije monstruozno, ako proguglas videces mnogo primera kako to isto da izvedes uz pomoc vrlo gadnih trikova na drugim rdbms-ima



Citat:
djoka_l:A to da DELETE sa JOIN nad tri tabele radi brže nego tri DELETE naredbe, to tek nema teorije da me ubediš.


zavisi, ako imas 3 nezavisna delete-a tipa delete from t1 where x=7; delete from t2 where y=7; i delete from t3 where z=7; onda su 3 delete-a mnogo brza nego kontrapcija sa joinom, sa druge strane ako imas uslove koji zahtevaju da hit bude kroz sve tri tabele onda je mnogo brze raditi jedan join delete nego simulirati cascade delete kroz skript ... naravno da je brze da ima cascade delete ali nesto se bojim da mu se ne isplati da redizajnira bazu zbog jednog upita sad pa ko zna kad :D
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Brisanje slogova iz više tabela09.04.2013. u 11:12 - pre 134 meseci
OK, priznajem da u slučaju koji nije kao u ovom pitanju, može biti da je delete sa join brže.

Ovde je, očigledno, u pitanju loš dizajn baze.

Tabela DOKUMENT_GLAVA ima primarni ključ nad poljem id_glava, a to se nigde ne koristi za vezu, nego se forsira upotreba dva polja (broj, rel_id_dok).
Treba lepo da se spusti id_glava i u druge dve tabele i da bude foreign key, pa još ako radi i on delete cascade ima sve da fercera ko ludo...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Brisanje slogova iz više tabela09.04.2013. u 11:30 - pre 134 meseci
Citat:
djoka_l: OK, priznajem da u slučaju koji nije kao u ovom pitanju, može biti da je delete sa join brže.


suvise mu je ruzan taj upit da bi ga nesto detaljno zagledao :D, ja vidim nema join vec , , , znaci implicitni inner, ako negde fali nema rezultat i to je to, outer ce uradi posao, kazem mu sta da pogleda i on dalje resi sam sebi problem, nesto nauci i svima super .. 90% ljudi koji ovde nesto pitaju imaju los dizajn baze, ja kad imam kad spomenem, kad nemam kad ne spomenem .. kada nije strasno odcutim .. kada sam umoran "otaljam" .. ima ovde ljudi koji znam da umeju lepo da nacrtaju bazu pa im opet baze lose, jbg sta da rade, nasledili 10+ godina star sistem budzen svih 10 godina i sad samo jos fali da im ja skacem po lobanji sa otkrivanjem tople vode :D

mysql kao takav ima svoje repove, jbg, tu se nista ne moze, da nas nije uzeo oracle mi smo planirali da u 6.0 napravimo dosta veliku odstupnicu od nekih repova, tako je nastao drizzle projekat koji je trebao da testira neka resenja i neka secenja da bi to otislo kako valja u 6.0, onda se pojavio oracle koji ima filozofiju da bez obzira sto je neko ponasanje "debilno" nije po standardu, nije logicno etc etc, ako je to ponasanje bilo u produkcionoj verziji to ponasanje mora da se ispostuje u svim narednim verzijama... dakle nekog secenja te vrste nece biti nikad .. drizzle je otisao u svom pravcu ... sa druge strane 5.6 je uspeo da uvede brdo stvari koje smo hteli a nismo imali kad da napravimo (ne bi sad o detaljima zasto, iz mojih usta to moze jako pogresno da se shvati a i ti ljudi koji su "krivi" su ipak ljudi koje vrlo postujem) smo najzad napravili i odsekli smo dosta toga i pripremili za odsecanje dosta toga za 5.7 a ipak zadrzali kompatibilnost sa strane klijenta... (u 5.7 bi trebalo da najzad ne postoji myisam uopste, osim ako ga explicitno ne trazis, nema vise frm fajlova...)
 
Odgovor na temu

[es] :: MySQL :: Brisanje slogova iz više tabela

[ Pregleda: 2148 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.