SQL insert statement i flere tabeller
hej Linuxin.
Da jeg så mange andre gange har fundet en løsning asf et klogere hoved herinde fra - prøver jeg gerne lykken igen.
Jeg har et lillle problem med INSERT statement til en postgresql 8.4.
Istedet for at lave en tabel med en masse kolonner - prøver jeg at dele denne lidt ud -. således jeg reelt har 3 tabeller:
Den 1kolonne i hver tabel er en serial unik primær nøgle.
Jeg starter med at oprette en ordre således at der er data i tabellen orders.
Til hver ordre kan der være flere ordrelinier (som hver især kan have en fil vedhæftet - ellere rettere navnet på den).
MEN mit problem kommer så nu - Efter at have oprettet en ordre - skal jeg tilføje en ordrelinie.
Til denne linie kan jeg have tilknyttet nogle filer - så derfor vil jeg gerne indsætte dette data på en gang - men hvodan kan jeg få linket automatisk imellem lineid i orderline og files i en og samme inseret kommando.
Jeg ville gerne hen i noget ala
INSERT INTO orderline(orderid,numbers,type) VALUES('1','20','T-shirts') and files(lineid,name.description) Values (orderline.lineid,'Linux geek','Sort med hvid tryk');
Som sagt er orderline.lineid lavet som en SERIAL UNIQUE PRIMARY KEY - som fortløbende nummer - men jeg vil meget gerne knytte lineid - sammen da det er ikke altid at der er filer med, men således kan man så tilknytte filer hvis det er noget - under oprettelsen af ordrelinien.
Nu har jeg siddet ret langt tid og kan ikke finde den korrekte løsning - og tror desværre jeg er kommet dertil hvor jeg ikke lige kan finde den rigtige kommando, da jeg har prøvet alle mulige kombinationer uden held - er der nogle flinke sjæle der kan hjælpe mig - eller få peget mig grundigt i den rette retning - for at løse dette !
Hvad hjeg helst ville var at indsætte de data i en og samme INSERT linie ????
PFT
P
Da jeg så mange andre gange har fundet en løsning asf et klogere hoved herinde fra - prøver jeg gerne lykken igen.
Jeg har et lillle problem med INSERT statement til en postgresql 8.4.
Istedet for at lave en tabel med en masse kolonner - prøver jeg at dele denne lidt ud -. således jeg reelt har 3 tabeller:
TABLE orders
|orderid|date|contact|
TABLE orderline
|lineid|orderid|numbers|type|
TABLE files
|fileid|lineid|name|description|
Den 1kolonne i hver tabel er en serial unik primær nøgle.
Jeg starter med at oprette en ordre således at der er data i tabellen orders.
Til hver ordre kan der være flere ordrelinier (som hver især kan have en fil vedhæftet - ellere rettere navnet på den).
MEN mit problem kommer så nu - Efter at have oprettet en ordre - skal jeg tilføje en ordrelinie.
Til denne linie kan jeg have tilknyttet nogle filer - så derfor vil jeg gerne indsætte dette data på en gang - men hvodan kan jeg få linket automatisk imellem lineid i orderline og files i en og samme inseret kommando.
Jeg ville gerne hen i noget ala
INSERT INTO orderline(orderid,numbers,type) VALUES('1','20','T-shirts') and files(lineid,name.description) Values (orderline.lineid,'Linux geek','Sort med hvid tryk');
Som sagt er orderline.lineid lavet som en SERIAL UNIQUE PRIMARY KEY - som fortløbende nummer - men jeg vil meget gerne knytte lineid - sammen da det er ikke altid at der er filer med, men således kan man så tilknytte filer hvis det er noget - under oprettelsen af ordrelinien.
Nu har jeg siddet ret langt tid og kan ikke finde den korrekte løsning - og tror desværre jeg er kommet dertil hvor jeg ikke lige kan finde den rigtige kommando, da jeg har prøvet alle mulige kombinationer uden held - er der nogle flinke sjæle der kan hjælpe mig - eller få peget mig grundigt i den rette retning - for at løse dette !
Hvad hjeg helst ville var at indsætte de data i en og samme INSERT linie ????
PFT
P
Kommentarer7
Blindgyde
Lad være med at prøve, at gøre det hele på en gang.
Dine index er autogenererede, hvis jeg forstår dig ret, så opret din ordre. Brug ordreid til at oprette dine ordrelinier, og brug lineid til at oprette evt. filer.
Med andre ord: For at oprette en fil, skal du bruge en lineid. Derfor er du nødt til at oprette en ordrelinie først. En ordrelinie skal bruge en ordreid, så derfor må du først oprette en ordre.
I øvrigt en god ide, at dele det op, som du har gjort.
Jeg ved ikke helt hvad der
INSERT INTO order(date, contact) VALUES([data], [contact]);
orderid = get_last_id;
foreach (orderline) {
INSERT INTO orderline(orderid, numbers, type) VALUES(orderide, '20', 'T-shirts');
orderlineid = get_last_id;
INSERT INTO files(lineid, name, description) Values (orderlineid, 'Linux geek', 'Sort med hvid tryk');
}
Håber det giver mening :).
Absolut det giver mening :
Absolut det giver mening : -)
Takker mange gange...
p
@Hey Mich.
Det er jo bare en
Det er jo bare en omvej på nogle punkter at skulle den vej rundt, men jo mine index er auto.
Min plan var lidt at skulle starte med at oprette den ordre - det fungerer fint nok. Og det fungerer også med at oprette en ordrelinie, men det er kun enkelte gange at der er filer med. derfor ville jeg enormt gerne kunne oprette mine ordrelinier - og sætte mine mine tilknyttet på en og samme gang, da jeg frygter en masse forvirring, hvis de skal oprette en ordrelinie for derefter at sætte billeder på den linie(så bliver det ikke altid gjort mm) så frygter lidt det at det aldrig bliver gjort.
MEN nu sidder jeg så og roder lidt med det - og har fundet Returning statementet som faktisk fungerer her. Men så er det med at programmere sig frem til at der modtages efter et insert statements.
Men eftersom det er JSP - skal jeg lige tilrette det således det passer til min reelle ide
Min pointe er blot, at
Min pointe er blot, at jeg mener, at files har brug for en lineid for at knytte den til en ordrelinie. Derfor skal ordrelinien oprettes først.
Nogen med forstand på postgresql kan nok sige, om det kan lade sig gøre i en sætning.
Det synes jeg dog ikke er så vigtigt. Det forhindrer jo ikke, at din brugerflade behandler det som en samlet operation.
@ Mich.
Det er jo rigtigt
Det er jo rigtigt nolk - og har lavet den med en radiogroup, som siger om der skla vedhæftes en fil - og skal der det - så viderestiller den efter at have insertet data _ og derefter lever en select - hvor den tager det seneste oprettede lineid .
Selvfølgelig kan det lade sig gøre :-)
men som du selv siger - det er nok nemmere den anden vej - Umiddelbart tænker jeg bare på at gøre en kammerat glad- så han kan få noget styr på sine ordre mm !
Takker for input!
Serial data typen eksisterer
Den oprettede sequence kommer til at hede tablename_columnName_seq.
Dette betyder at du i dit tilfælde kan starte med at selecte den næste værdi sekvensen:
SELECT nextval('orders_orderid_seq');
Den returnerede værdi sætter du manuelt som orderid når du insætter en rækken i orders tabellen, og derved ved du hvilket id du skal refererer til i de tilhørende order_line rækker.