[ misk0 @ 28.10.2005. 16:02 ] @
Znaci imam sledeci problem:
Pravim web shop i imam 2 temp tabele (tako ih ja zovem) koje punim sadrzajem kosarice.
Namjerno sam ih nazvao temp da bih ih mogao puniti i brisati bez problema, tj bez straha da cu obrisati vec gotove narudzbe.
jedna je
temp_orders (id, session_id, prod_id, quantit, ...)
gdje su recordi proizvodi koje korisnik narucuje, druga je
temp_order_desc (id, order_id, value...)
koja zapravo predstavlja detalje o jednom proizvodu koje upisuje korisnik pri narucivanju.
(odnos master->detail).

Kad zavrsi sa punjenjem kosarice, korisnik ide na upis licnih podataka i tu se narudzba zakljucuje.
Ono sto ja pri 'zakljucenju' narudzbe zelim jeste podatke iz temp_orders prebaciti u
orders(id, personal_id, prod_id, ...) koja je zapravo kopija temp_orders s tim sto dodatno ima i personal_id, koji je veze na ime korisnika.
Sad, to kopiranje nije problematicno medjutim nastaje problematicno kopiranje temp_order_desc u order_desc jer u ovom slucaju order_desc->order_id treba da odgovara order->id a ne kao sto je vec temp_order->id.

Sad, jedno od rijesenja je formirati neku $#%$#temp tabelu, potrpati sve podatke tamo, i onda podijeliti ih u vec postojece tabele, na kraju je obrisati.
Drugo rijesenje je sve smjestiti u nizove, napraviti red i onda spiciti nekih 5-10 insert-a, buduci da nemam puno proizvoda u webshopu, medjutim to je ono 'seljacko' rjesenje pa ne bih bash.

Ideje?

p.s. nadam se da nisam pretjerano konfuzan jer je i meni trenutno konfuzija u glavi.. Djeluje mi jednostavno ali ne mogu... :)

p.s.s. inace je baza mySQL, ali mislim da se ovo da rijesiti i u svakoj drugoj bazi.
[ _owl_ @ 28.10.2005. 23:03 ] @
Google je zakon ako znas sta trazis.
Code:

INSERT INTO orders (ime_kolone1, ..., ime_kolonen) SELECT kolona1, ..., kolonaN FROM temp_orders;

Koliko sam shvatio tebe samo buni sto ove dve tabele imaju dva imena za kolonu koja cuma semanticki iste podatke.
[ misk0 @ 28.10.2005. 23:55 ] @
To je jedan par opanaka.
Drugi je u details tabeli.

To sto si napisao, sam vec uradio, znaci kopirao stavke iz temp_orders u orders.
Ali sad treba iskopirati iz temp_ordes_desc u orders_desc, s tim da se kreiraju relacije u novim tabelama
tj ako je u temp_orders -> temp_orders_desc postojala relacija 1:3
tako u orders->orders_desc treba postojati ista relacija tj iste stvake.
[ Riste Pejov @ 29.10.2005. 20:03 ] @
Kad kazes da je problem sa ID master tabele, onda mi to nekako indicira da ID ti je autoinc kolona ?

Ako je to autoinc ... onda bi nekako ovako izgledalo to
Code:

INSERT INTO orders (ime_kolone1, ..., ime_kolonen) SELECT kolona1, ..., kolonaN FROM temp_orders WHERE temp_orderID = X;

INSERT INTO order_details(orderID, .....) SELECT LAST_INSERT_ID(), kolona1, ... kolonaN FROM temp_order_details WHERE temp_orderID   = X;

[ misk0 @ 29.10.2005. 21:42 ] @
Hm, to bi fino radilo da je rijec o jednom recordu, ali rijec je o njih 'n'. Znaci moze biti 1 a moze biti 10. I ne moraju obavezno svi imati details, a mogu :)
[ Riste Pejov @ 31.10.2005. 08:40 ] @
Ako verzija MySQL-a nije 5.x koja podrzava stored procs ne preostaje ti nista drugo nego da ides record po record. Ali ipak ja bi ti savetovao da promenis strukturu baze.

znaci neka temp tabela ima autoinc za PK, a da prava tabela jednostavno ID kolonu preuzme iz temp tabele, tako da ce ti ref intergritet ostati nedirnut. Ovo moze upaliti jedino ako se prava tabela puni iskljucivo iz temp tabele.

I proveri dali bi mogao da migriras tabele na InnoDB i da postavis foreign keys.

[Ovu poruku je menjao Riste Pejov dana 31.10.2005. u 09:41 GMT+1]
[ Dejan Topalovic @ 31.10.2005. 09:01 ] @
Ne vjerujem da se moze to uraditi samo sa SQL-om...

E, sad, mozes koristiti ili jednu "session-based" temp tabelu, ili da uradis logicki dio u nekom od programskih jezika (hint: koristi nizove), pa konacan rezultat zapises u order i order_desc tabele...

Trenutno mi nista drugo ne pada na pamet...
[ Riste Pejov @ 31.10.2005. 12:11 ] @
Ako sam ja dobro razumeo pitanje, valjda bi moglo da se to resi ovako:
(ako nisam, izvinite zbog dugackog posta )
Code:

CREATE TABLE temp_master(
ID autoincrement,
data char[10],
PRIMARY KEY (ID)
)
CREATE TABLE temp_detail(
ID autoincrement,
ParentID big int,
data char[10],
PRIMARY KEY (ID)
)

CREATE TABLE master(
ID big int,
data char[10],
PRIMARY KEY (ID)

)
CREATE TABLE detail(
ID big int,
ParentID big int,
data char[10],
PRIMARY KEY (ID)
)

insert into temp_master (data) values('bla1');
insert into temp_detail (ParentID,data) values(LAST_INSERT_ID(), 'bla11');
insert into temp_detail (ParentID,data) values(LAST_INSERT_ID(), 'bla12');
insert into temp_detail (ParentID,data) values(LAST_INSERT_ID(), 'bla13');

insert into temp_master (data) values('bla2');
insert into temp_detail (ParentID,data) values(LAST_INSERT_ID(), 'bla21');
insert into temp_detail (ParentID,data) values(LAST_INSERT_ID(), 'bla22');
insert into temp_detail (ParentID,data) values(LAST_INSERT_ID(), 'bla23');

INSERT INTO master (ID, data) SELECT ID,data FROM temp_master;
INSERT INTO master (ID, ParentID, data) SELECT ID, ParentID, data FROM temp_detail;


na kraju ref integritet je tacno prebacen iz temp u pravih tabela
[ misk0 @ 31.10.2005. 13:48 ] @
Ovako ..
Postoji mogucnost da uradim da ID iz temp_orders tabele ide u ID orders ali me tu buni jedno moje NEznanje. Sta se desava sa autoincrement kad se tabela popuni sa svih nekih 100mil vrijednost tj kad dodje do kraja brojac? Ide od pocetka ili popunjava rupe?
Mislim, to je mala mogucnost znaci da neko napravi int(11) znaci 99.999.999.999 recorda.
Rijesio sam taj problem na sledeci nacin.

1.
$query = "INSERT INTO ss_orders (person_id, product_id, sub_prod_id, price, quantity, weight, old_id) ";
$query .= "SELECT ".$personal_data->id.", product_id, sub_prod_id, price, quantity, weight, id FROM ss_temp_orders ";
$query .= "WHERE session_id = '$session_id'";

2.
$query = "INSERT INTO ss_order_desc (order_id, desc_name, value) SELECT t.id, d.desc_name, d.value ";
$query .= "FROM ss_temp_order_desc as d, ss_orders as t WHERE d.order_id = t.old_id AND t.person_id = ".$personal_data->id;

Znaci, napravio sam old_id kolonu gdje se smjesta stari ID. Onda potrazim po temp_details tabeli recorde koji imaju old_id i vezem ih za nove.



[Ovu poruku je menjao misk0 dana 31.10.2005. u 14:55 GMT+1]
[ Riste Pejov @ 31.10.2005. 14:37 ] @
pa ako ti je ID numerci(18,0) t.j. BIG INT ... znaci da ces imati toliko puno posla da ce ti biznis procesi traziti da redizajniras softver mnogo pre nego sto stignes do rednog broja sa 18 nuli :) I u svako vreme mozes da imas kompozitni ID, dve BIG INT kolone da budu PK i onda imas 36 nuli za rednog broja ... i tako nadalje :)