konto usunięte

Temat: uzupelnianie table of FK

Witam,
Co musze zrobic zeby majac np dwie i wiecej tabel typu:
1) OSOBY
autoID (PK, AI)
imie
nazwisko
.....

2) TELEFONY
telID (PK, AI)
telefon
fk_osoby_autoID (FK)

miec możliwosc wpisania i danych osoby i przyporzdkowanego telefonu do tej osoby jednoczesnie. Tzn nie chce wpisywac recznie wygenrowanego przez OSOBY autoID do fk TELEFONÓW.Dawid Karel edytował(a) ten post dnia 30.03.08 o godzinie 17:13
Jakub L.

Jakub L. Programista

Temat: uzupelnianie table of FK

Napisać funkcję.

konto usunięte

Temat: uzupelnianie table of FK

Jakub L.:
Napisać funkcję.

Hmm ja raczej jestem w tych sprawach zielony jeszcze... czy moglbys mi podac przykład jak taka funkca powinna wygladac, gdzie sie powinna znalesc.. dzieki!
Jakub L.

Jakub L. Programista

Temat: uzupelnianie table of FK

Oracle ma plsql, PostgreSQL ma plpgsql i inne. Reszta nie wiem.

Pisze się funkcję na przykład taką, piszę jak leci, bo nie pamiętam składni, dawno się bawiłem:

fun dodaj($imie, $nazwisko, $telefon)
insert into osoby(imie, nazwisko) values(imie, nazwisko);
// tutaj robiło się jakiś myk, żeby wyciągnąć identyfikator tej osoby którą się właśnie wstawiło, niech się nazywa $id
insert into telefony(telefon, fk_osoby_autoID) values ($telefon, $id);
endf

http://www.postgresql.org/docs/8.3/static/plpgsql.html

konto usunięte

Temat: uzupelnianie table of FK

W mySQL mozna np. tak:

DELIMITER $$

DROP PROCEDURE IF EXISTS `cc`.`add_user` $$
CREATE PROCEDURE `add_user`(
IN fname VARCHAR(20),
IN phone VARCHAR(10),
OUT p_sqlcode INT,
OUT p_status_message VARCHAR(100)
)
BEGIN

-- START Declare Conditions
DECLARE foreign_key_violated CONDITION FOR 1216;
-- END Declare Conditions

DECLARE CONTINUE HANDLER FOR foreign_key_violated
BEGIN
SET p_sqlcode=1216;
SET p_status_message='Foreign key violated';
END;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET p_sqlcode=1329;
SET p_status_message='No record found';
END;

SET p_sqlcode = 0;

INSERT INTO `user` VALUES (NULL, fname);
INSERT INTO `phone` VALUES(NULL, LAST_INSERT_ID(), phone );

END $$

DELIMITER ;

--
Wywolanie:
CALL add_user('Mark','200-20-20-20', @error_code, @status_message);
--

Pozdrawiam
Rafal
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: uzupelnianie table of FK

a jak chcesz wpisywac te dane? w mssq najprosciej zrobic wyzwalacz ktory dostawi fk przy "on insert"

konto usunięte

Temat: uzupelnianie table of FK

Dziekuje za pomoc, mysle ze teraz sobie dam jakos rade =) Rzeczywisie sprawdzialem trigger on insert, mysle ze jest to najlepsze rozwiazanie. Teraz jeszcze tylko sprawdze jak to podlaczyc wszystko w dreamweaverze. Rafal dziekuje za kod! Pozdrawiam!
Jakub Fila

Jakub Fila Inżynieria / finanse
/ zarządzanie

Temat: uzupelnianie table of FK

Jacek Ołowiak:
a jak chcesz wpisywac te dane? w mssq najprosciej zrobic wyzwalacz ktory dostawi fk przy "on insert"

Zdecydowanie trigger. Jeśli napisana zostanie procedura, która przy wstawianiu zrobi update obu tabel, to jeśli ktoś zrobi insert bez użycia tej procedury, to do tabeli z telefonami FK już nie zostanie dopisane. Trigger przed tym zabezpieczy. Oczywiście niezależnie od tego funkcja, która modyfikuje obie tabele też może istnieć.

Oczywiście w przypadku, kiedy powstanie trigger, trzeba zadbać, żeby pola z nr telefonu dopuszczały wartości NULL, bo trigger jak rozumiem stworzyłby po prostu pusty rekord z uzupełnionym FK.
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: uzupelnianie table of FK

Szkoda że nie bardzo wiadomo co to za baza danych. Jeżeli pracujesz na bazie obsługującej widoki to przygotuj taki widok który łączy te tabele i dodaj na nim osobne rule dla insert, update oraz delete.
Jeżeli tak zrobisz to będziesz mógł wczytywać dane przez widok a całą resztę załatwi za ciebie engine bazy... (postgreSQL)
Krzysztof Eugeniusz Kotkowicz

Krzysztof Eugeniusz Kotkowicz Freelancer,
Administrator
systemów
teleinformatycznych

Temat: uzupelnianie table of FK

Marcin Mackiewicz:
Szkoda że nie bardzo wiadomo co to za baza danych. Jeżeli pracujesz na bazie obsługującej widoki to przygotuj taki widok który łączy te tabele i dodaj na nim osobne rule dla insert, update oraz delete.
Jeżeli tak zrobisz to będziesz mógł wczytywać dane przez widok a całą resztę załatwi za ciebie engine bazy... (postgreSQL)

Hmmm... Przy MySQL nie pokusiłbym się o użycie widoku - szczególnie przy bazie, która będzie mocniej obciążona. Wydajność obsługi widoków jest tragiczna.

Następna dyskusja:

#Table i magia...?




Wyślij zaproszenie do