Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak symulować sekwencje
prond
post 15.02.2007, 09:49:12
Post #1





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Mam pytanie do MySQL'owców : czy można w jakikolwiek sposób emulować sekwencje w MySQL ?

Chciałbym móc wykonywać zapytania następującej postaci:
  1. BEGIN;
  2.  
  3. INSERT INTO master (id, created)
  4. VALUES (master_seq.NEXTVAL, SYSDATE) ;
  5.  
  6. INSERT INTO detail (master_id, title)
  7. VALUES (master_seq.currval, 'Johny') ;
  8.  
  9. INSERT INTO detail (master_id, title)
  10. VALUES (master_seq.currval, 'Tonny') ;
  11.  
  12. INSERT INTO detail (master_id, title)
  13. VALUES (master_seq.currval, 'Ronnie') ;
  14.  
  15. COMMIT;


Próbowałem wykorzystać funkcję LAST_INSERT_ID(), ale ona ma ograniczony zasięg (nie mogę przy jej użyciu pobrać bieżącej wartości sekwencji tabeli 'master' wstawiając wiersz do tabeli 'detail').

Ten post edytował prond 15.02.2007, 09:51:16


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
nospor
post 15.02.2007, 10:07:28
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




w mysql mamy cos takiego jak autoincrement. Nadajesz dla klucza glownego ze ma byc autoincrement i kazdy kolejny rekord, jesli nie okreslisz z palca ID, bedzie mial ID o jeden wiekszy.

last_insert_id() dziala prawidlowo, czyli zwraca id rekordu ostatnio dodanego do bazy.

Przyklad, ktory dziala:
  1. INSERT INTO x (FIELD) value ('jakas wartosc');
  2. SET @id= LAST_INSERT_ID();
  3. INSERT INTO y (ID_X, FIELD) value (@id, 'jakas wartosc');
  4. INSERT INTO y (ID_X, FIELD) value (@id, 'jakas wartosc');

Oczywiscie tabele x i y maja jeszcze pole ID, ktore jest autoincrement.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
prond
post 15.02.2007, 10:44:27
Post #3





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Próbowałem wykonać zapytanie, które mi zasugerowałeś, ale dostaję BŁĄD :

  1. mysql> INSERT INTO master (created) VALUES (NOW());
  2. Query OK, 1 row affected (0.00 sec)
  3.  
  4. mysql> SET @myid = LAST_INSERT_ID();
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> SELECT @myid;
  8. +-------+
  9. | @myid |
  10. +-------+
  11. | 6 |
  12. +-------+
  13. 1 row IN SET (0.00 sec)
  14.  
  15. mysql> SELECT @myid;
  16. +-------+
  17. | @myid |
  18. +-------+
  19. | 6 |
  20. +-------+
  21. 1 row IN SET (0.00 sec)
  22.  
  23. mysql> INSERT INTO detail (master_id, title) VALUES (@myid, 'Johny');
  24. ERROR 1062 (23000): Duplicate entry '0' FOR KEY 1


W czym teraz może tkwić problem ?


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
bendi
post 15.02.2007, 10:46:11
Post #4





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


A czemu zapisywac wartosc zwracana przez LAST_INSERT_ID do zmiennej - przeciez to sie nie zmienia na poziomie sesji.

Poza tym jest druga sprawa, LAST_INSERT_ID przyjmuje parametr, ktory pozwala ustawic wlasnie te zmienna, wtedy mozemy sobie zrobic tabelke, w ktorej trzymamy nasza sekwencje i updateowac opowiednie pole:
  1. UPDATE seq SET id=id+1;
  2. SELECT last_insert_id(id) FROM seq;


--------------------
Go to the top of the page
+Quote Post
nospor
post 15.02.2007, 10:53:05
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@prond nie ustawiles dla tabeli master pola ID jako autoincrement i on ci zera powstawial.

@bendi ale przeciez last_insert_id zwraca id ostatnio dodanego rekordu, a prond dla 3 ostatnich insertow chce miec id z pierwszego inserta
A twoj drugi sposob z dodatkowa tabela jak na moj gust jest zdecydowanie dluzszy i mniej przyjazny winksmiley.jpg


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
prond
post 15.02.2007, 10:54:40
Post #6





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Już poszło, dzięki.
Nie ustawiłem auto_increment dla tabelki 'detail'.

Teraz działa tak, jak powinno przy takiej postaci kodu:
  1. BEGIN;
  2.  
  3. INSERT INTO master (created)
  4. VALUES (NOW()) ;
  5.  
  6. SET @myid = LAST_INSERT_ID();
  7.  
  8. INSERT INTO detail (master_id, title)
  9. VALUES (@myid, 'Johny') ;
  10.  
  11. INSERT INTO detail (master_id, title)
  12. VALUES (@myid, 'Tonny') ;
  13.  
  14. INSERT INTO detail (master_id, title)
  15. VALUES (@myid, 'Ronnie') ;
  16.  
  17. COMMIT;


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
nospor
post 15.02.2007, 10:55:52
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




edit:
@prond nie dolukalem twoich wszystkich wynikow. to chyba dla detail masz cos nie tak z kluczem glownym

edit: edytowalismy w tym samym czasie, smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
bendi
post 15.02.2007, 12:59:18
Post #8





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 15.02.2007, 12:53:05 ) *
@bendi ale przeciez last_insert_id zwraca id ostatnio dodanego rekordu, a prond dla 3 ostatnich insertow chce miec id z pierwszego inserta

Fakt moj blad - nie doczytalem smile.gif
Cytat(nospor @ 15.02.2007, 12:53:05 ) *
A twoj drugi sposob z dodatkowa tabela jak na moj gust jest zdecydowanie dluzszy i mniej przyjazny winksmiley.jpg

A ja wcale nie twierdze, ze jest lepszy, po prostu lubie dawac ludziom duzo opcji do wyboru smile.gif


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.08.2025 - 03:51