Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak symulować sekwencje
Forum PHP.pl > Forum > Bazy danych > MySQL
prond
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').
nospor
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.
prond
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 ?
bendi
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;
nospor
@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
prond
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;
nospor
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
bendi
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.