Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dodawanie rekordu z wartością o jeden większą niż poprzednia
thomson89
post 16.08.2010, 10:17:27
Post #1





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


Witam!

Potrzebuję wstawić do bazy danych rekordy, w których jedną z wartości będzie wartość poprzedniego rekordu tej kolumny powiększona o 1. Próbowałem tak:
[MYSQL] pobierz, plaintext
[MYSQL] pobierz, plaintext

Kod
INSERT INTO `podstrony` (tytul, nazwa, tekst, kol) VALUES ('tytul', 'nazwa', 'tekst', MAX(`kol`) + 1)


Ale niestety nie działa. Proszę o pomoc!

Pozdrawiam!

PS: Nie działają tagi mysql, dlatego wstawiłem w code.

Ten post edytował thomson89 16.08.2010, 10:18:40


--------------------
Sklep 70%
Go to the top of the page
+Quote Post
thek
post 16.08.2010, 10:28:12
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A to nie prościej tej kolumnie nadać atrybut autoincrement i olać sprawę? winksmiley.jpg


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
wookieb
post 16.08.2010, 10:33:32
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A nie lepiej użyć własciwości o nazwie "auto inkrementowanie" (autoincrement) w MySQL?
Załóż klucz na tą kolumnę o nazwie "kol" oraz wykonaj poniższe zapytanie w bazie MySQL
  1. ALTER TABLE `tee` CHANGE `id` `id` INT( 11 ) NOT NULL AUTO_INCREMENT

Wykorzystanie MySQL pozwoli ci na automatyczne numerowanie kolumn przy dodawaniu każdego rekordu. Oznacza to, że jeżeli nie podasz wartości dla kolumny o nazwie "KOL" w zapytaniu insert zostanie tam wstawiony kolejny numer z właściwości "auto inkrementowanie".


P.s. Tak ten post miał być ironiczny @THEK.

A tak na serio to pewnie wartość kol może się powtarzać w całej tabeli?

Ten post edytował wookieb 16.08.2010, 10:36:37


--------------------
Go to the top of the page
+Quote Post
thomson89
post 16.08.2010, 10:37:12
Post #4





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


A jak się zachowa auto_increment jak będę zmieniał te wartości?


--------------------
Sklep 70%
Go to the top of the page
+Quote Post
erix
post 16.08.2010, 10:40:08
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A jak miałby się zachować?

Z tego, co pamiętam, to auto_increment generuje wartość dla nowego rekordu korzystając z formuły:
  1. MAX(klucz_glowny)+1


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
wookieb
post 16.08.2010, 10:40:16
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie zmienia się tak łatwo.
Przykładowo dodasz 100 rekordów , usuniesz 99 to kolejny rekord będzie mieć numer 101.
Pewnie nie o to Ci chodzi?

@THEK mode
@Erixie niestety tak nie jest, wartość auto_increment jest przechowywane dla każdej tabeli oddzielnie, tak więc przypomnę, że przykładowo dodasz 100 rekordów , usuniesz 99 to kolejny rekord będzie mieć numer 101.
W tabeli może być jedno pole z opcją "autoincrement" i dodatkowo na pole to musi zostać założony klucz (czyli taki spis treści dla bazy danych, który bardzo się przydaje w wielu zapytaniach chociażby wyszukiwanie rekordu po tym polu)
END @THEK mode



Ten post edytował wookieb 16.08.2010, 10:42:37


--------------------
Go to the top of the page
+Quote Post
thomson89
post 16.08.2010, 10:52:28
Post #7





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


To tak nie może być. Wartości muszą być kolejne. Na podstawie tego będzie menu robione.
Kod
ID - Pole 1 - Pole 2 - kol
1 -- tektst -- tekst -- 1
2 -- tekst --- tekst -- 2

lub
Kod
ID - Pole 1 - Pole 2 - kol
1 -- tektst -- tekst -- 2
2 -- tekst --- tekst -- 1

Jak dodam następny powinno być kol 3. A jak usunę ID 1, to id 2 powinno mieć kol 1 (to se zrobię). Z tego co mówi wookieb, wtedy następny kol będzie o wartości 3. Czyli przeskoczy o jedno. Auto_increment nie pasuje do tego zupełnie.
Kod
ID - Pole 1 - Pole 2 - kol
2 -- tekst --- tekst -- 1
3 -- tekst --- tekst -- 3


Ten post edytował thomson89 16.08.2010, 10:53:24


--------------------
Sklep 70%
Go to the top of the page
+Quote Post
wookieb
post 16.08.2010, 11:07:48
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. SELECT @wartosc_pola := MAX(pole) FROM tee;
  2. INSERT INTO tee (pole) VALUES ( IF(@wartosc_pola IS NULL, 0, @wartosc_pola) + 1 )


P.s. Thek nie rób mi teraz wszystkich możliwych permutacji tych zapytań.


--------------------
Go to the top of the page
+Quote Post
erix
post 16.08.2010, 11:11:40
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




~wookieb - fakt, ale skądś ta wartość do zapisu musi być wzięta. winksmiley.jpg

I odczep się od ~thek. tongue.gif


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
thomson89
post 16.08.2010, 11:42:03
Post #10





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


O takie coś mi chodziło. Dzięki!


--------------------
Sklep 70%
Go to the top of the page
+Quote Post
thek
post 16.08.2010, 12:05:00
Post #11





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Mam pytanie do thomsona... O co Ci chodzi w zdaniu "A jak się zachowa auto_increment jak będę zmieniał te wartości?". O to, że chciałbyś wartości tych pól ręcznie modyfikować? Jeśli tak to weź pod uwagę własności klucza. Modyfikować te wartości możesz jak najbardziej, ale pewne ograniczenie masz. Zazwyczaj autoincrement jest primary lub unique, wiec nie założysz klucza o id już istniejącym w bazie choćby. Z tego co kojarzę to wartość autoincrement jest przechowywana w bazie i wskazuje na liczbę większa o jeden od ostatnio wstawionego rekordu (wstawionego... nie zmodyfikowanego). Szczerze to nigdy nie sprawdzałem co się stanie jeśli przykładowo mamy 100 rekordów, a więc autoincrement ma 101, my przykładowo rekord o id=90 ustawimy na 105 i wstawimy kolejno 10 rekordów. Nie testowałem jak baza zachowa się przy owym 105. Czy go zignoruje i po 104 wstawi 106, czy może wywali błąd próbując wstawić coś na 105. Jeśli chciałbyś bez luk, to z tego co co już kiedyś nawet tutaj poruszano, musiałbyś zrobić własną funkcję modyfikująca te klucze i związane z nimi powiązania. A to może być dla bazy zabójcze.

Wookieb... Poza tym Twój przykład jest skuteczny tylko przy usuwaniu rekordu ostatniego i tylko dla niego ma sens. usunięcie id ze środka nie sprawi, że luka ta magicznie się sama załata. Choć sam indeks w tym miejscu jest pusty i dowolny wpis, który mógłby by jako autoincrement śmiało mógłby w tę lukę wskoczyć. Ale wymagało by to:
a) zapamiętanie autoincrement
cool.gif wyszukanie luki
c) jeśli jest luka wrzucamy rekord pod jej id i ustawiamy autoincrement na zapamiętany (baza będzie chciała na pałę go zwiększyć przy insert)
d) jeśli nie ma luki to robimy zwykły insert bez modyfikacji autoincrement po nim.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
thomson89
post 16.08.2010, 12:45:03
Post #12





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


Ja, przy usuwaniu będę musiał obniżyć kol każdego powyższego o 1. Na szczęście takich rekordów będzie maks. 20. Tak samo przy sortowaniu, będę musiał jednym rekordom zmniejszać kol a drugim zwiększać.

No właśnie chodziło mi o zachowanie auto_incrementa przy modyfikowaniu tych kluczy. W tej tabelce już mam jedno auto_increment.


--------------------
Sklep 70%
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: 14.08.2025 - 10:51