![]() |
![]() ![]() |
![]() |
![]()
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:
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
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
![]()
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ę?
![]() -------------------- 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
|
|
|
![]()
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
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 -------------------- |
|
|
![]()
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
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
![]()
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:
-------------------- ![]() 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! |
|
|
![]()
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 -------------------- |
|
|
![]()
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
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
P.s. Thek nie rób mi teraz wszystkich możliwych permutacji tych zapytań. -------------------- |
|
|
![]()
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.
![]() I odczep się od ~thek. ![]() -------------------- ![]() 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! |
|
|
![]()
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
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
![]()
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 ![]() 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
|
|
|
![]()
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
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 10:51 |