[MySQL] Modyfikacja rekordów


(Quentin) #1

Cześć.

Aby poprawić rekord możemy posłużyć się taką komendą:

UPDATE ksiazki SET tytul="PHP 3" WHERE id=5;

Zmieni ona w tabeli ksiazki tytuł dla wiersza, którego pole id ma wartość 5. W mojej tabeli są następujące kolumny: - id - określiłem jako klucz główny (PRIMARY KEY) - tytul - autor - kategoria Moje pytanie jest takie: czy po wyrażeniu WHERE, musi być napisana kolumna, która jest kluczem głównym czy niekoniecznie :?: Mógłbym zamiast tego napisać:

UPDATE ksiazki SET tytul="PHP 3" WHERE autor=Jan Kowalski;

:?:


(adpawl) #2

Pewnie, że tak ...nie musisz w warunku wykorzystywać kolumny z kluczem głównym.

Popraw tylko dodając cudzysłów...


(Kutar 0) #3

Po pierwsze ciągi znaków obejmij w cydzysłowy albo apostrofy:

UPDATE ksiazki SET tytul="PHP 3" WHERE autor="Jan Kowalski"

Ostatecznie możesz, ale jest to rozwiązanie bardzo nieoptymalne. Jeśli zrobisz to wykorzystując klucz główny, to baza odwoła się bezpośrednio do tego rekordu. A jesli po dowolnym innym polu, to mysql musi przeszukać WSZYSTKIE rekordy. Gdyby Twoja tabela zawierała np. 10000 rekordów, to byłby to nie lada wysiłek dla bazy. Dlaczego tak się dzieje? Ano dlatego, że primary key o danej wartości może być tylko jeden w bazie i jest tak jakby "na początku". Jest kluczem do konkretnego rekordu. Jeśli nie wybierasz po kluczu, to baza przeszukuje każdy rekord po kolei, by sprawdzić na nim dany warunek.


(Quentin) #4

adpawl , ale gdy nie objąłem ciągu znaku apostrofami ' ' to nic się nie stało - czy jest to w swoim rodzaju jakiś błąd :?: :?


(GL1zdA) #5

Nieprawda. Stanie się tak pod warunkiem, że utworzenie klucza głownego implikuje utworzenie indeksu. Mozesz założyc indeks na dowolną kolumnę i zostanie przyspieszone na niej wyszukiwanie.


(Furin) #6

Pracuje w firmie gdzie niektóre Widoki mają około 20 milionów rekordów oraz około 14 kolumn i warunki czasem mają po kilkanaście linijek... a mimo wszystko nikt się nie przejmuje baza... liczy się efekt.. Pozatym jeżeli zapiszesz to w ten sposób

UPDATE ksiazki SET tytul="PHP 3" WHERE autor="Jan Kowalski"

To jeżeli Jan Kowalski będzie miał kilka książek to każdej zostanie przypisana wartość PHP 3 a jeżeli zrobisz to po ID to tylko dla konkretnego wiersza zostanie zmieniona wartość Złączono Posta : 28.11.2007 (Sro) 16:33Jeżeli chciałbyś stosować taką budowe wiersza to lepiej jakbyś zrobił

UPDATE ksiazki SET tytul="PHP 3" WHERE autor="Jan Kowalski" AND tytul="STARY_TYTUL"

Tylko to tez złe rozwiązanie bo gdy ktoś wprowadzi 2 takie same wiersze czyli

Stary tytuł -> Jan Kowalski

to obydwa zostaną zamienione a nie zawsze moze nam o to chodzic... musisz się zasnanowić jaki chcesz osiągnąć efekt i potem dopiero zastosować odpowiednie warunki


(Kutar 0) #7

Miałem na myśli sytuację bez indeksu, gdyż uznałem że autor tematu nie założył indeksu na kolumnie 'autor' :slight_smile:


(Quentin) #8

Dlaczego obydwa mają zostać zmienione? Przecież kolumna autor się nie zmieni - dalej pozostanie tam przecież Jan Kowalski :? Ale jeżeli się mylę to poprawcie mnie :roll:


(Kutar 0) #9

Chodzi o to, że gdybyś zastosował:

UPDATE ksiazki SET tytul="PHP 3" WHERE autor="Jan Kowalski"

, to jeżeli wiecej niż jeden rekord miałoby pole 'autor' jako "Jan Kowalski", to we wszystkich tych przypadkach tytuł zostanie zmieniony, gdyż wszystkie te rekordy spełniały by warunek :slight_smile:


(Quentin) #10

kutar , dzięki - już to pojąłem :slight_smile: