Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu sql Kanał ATOM (tag: sql)

Autor wpisu: batman, dodany: 03.11.2009 21:22, tagi: sql

PostgreSQL jest obok MySQL jedną z najpopularniejszych, darmowych baz danych. Baza ta oferuje bardzo ciekawe funkcjonalności, jak wspomniane w tytule dziedziczenie. Dziedziczenie odnosi się do tabel i umożliwia na stworzenie rozbudowanej struktury danych bez konieczności tworzenia ogromnej ilości relacji lub nadmiarowych kolumn. Dziedziczenie w PostgreSQL  jest zbliżone w założeniach do

Autor wpisu: JoShiMa, dodany: 23.10.2009 01:15, tagi: php, sql

Jak pisałam w poprzednim odcinku dotyczącym drzewek w bazie danych bardzo mi się spodobała idea drzewka typu Nested set, choć niektórzy namawiali mnie do zainteresowania się drzewami Depesza. Może kiedyś. Tymczasem porządkując swoją świeżo nabytą wiedzę i przemyślenia napiszę kilka słów o idei i typu Nested set. Jak każde rozwiązanie to ma zarówno wady i zalety. [...]

Autor wpisu: JoShiMa, dodany: 21.10.2009 22:01, tagi: php, sql

Chyba każdy programista tworzący dynamiczne strony internetowe w PHP zetknął się z problemem zaimplementowania struktury drzewiastej w bazie danych. Najczęściej ma to związek z konstrukcją menu, ale każdy serwis WWW jest właściwie o taką strukturę oparty. Ja do niedawna konstruowałam takie struktury w oparciu o jedną tabelę rekurencyjną. Każdy rekord zawierał pole informujące wskazujące [...]

Autor wpisu: JoShiMa, dodany: 16.08.2009 21:57, tagi: sql

Obecnie trudno sobie wyobrazić stronę internetową pisaną za pomocą PHP, która nie korzystałaby z bazy danych. Prawdopodobnie do takiego właśnie wniosku doszli twórcy Kohana skoro w bibliotece Model, po której dziedziczą tworzone przez programistów modele przewidzieli zmienną klasy Database. Klasa ta dostarcza wielu rozmaitych bibliotek pozwalając na łatwe i wygodne manipulowanie bazą danych. Oczywiście [...]

Autor wpisu: Athlan, dodany: 05.07.2009 10:02, tagi: sql

Usuwając coś permanentnie z bazy danych musimy być bardzo ostrożni, bowiem przywrócenie danych jest bardzo trudne, czasem niemożliwe. Podstawową strukturę bazy danych powinno się budować na samym początku tworzenia aplikacji, z biegiem czasu rozbudowywać ją, ale unikać przebudowywania. Niestety są przypadki, gdzie trzeba przebudować jedną rzecz, co powoduje zmianę w wielu warstwach nie tyle aplikacji, co strukturze bazodanowej.

Dziś postaram się opisać, jakie kroki trzeba wykonać, aby bezpiecznie usunąć zdublowane rekordy z bazy danych nie tracąc żadnych danych:

  1. Tworzymy dwie kopie bazy danych lub tabel, na których będziemy pracowali. Najlepiej, aby pracować na drugiej kopii, nigdy na oryginale, a potem wdrożyć zmiany z drugiej kopii na oryginał. Przezorny zawsze ubezpieczony.
  2. Analiza danych w tabeli. Musimy dokładnie wiedzieć jakie są relacje między tabelami, kiedy występują JOIN’y itp. Jeżeli rekordy są zdublowane, a posiadają ustalony ID, do których odwołuje się inny rekord z sąsiedniej tabeli, trzeba będzie w niej zmienić ID rekord zdublowanego na ID “substytuta”, bądź takiego rekordu, który nie spowoduje zmian w serwisie.
  3. Wykonanie operacji usunięcia zdublowanych rekordów.

Po wykonaniu kroku pierwszego zabieramy się za kolejny. Jest to najważniejszy moment naszych operacji. Aby ułatwić zrozumienie problemu, podam przykład z życia. Aplikacja posiadała poważny błąd, który umożliwiał zdublowanie użytkowników, ściślej: można było zdublować username. Za każdym razem, gdy użytkownik się logował i pisał komentarze, był ich właścicielem, ale comment_author posiadały różne ID tego samego użytkownika. Zaraz po skopiowaniu bazy danych spróbowałem przepisać ID autorów komentarzy na pierwszy rekord identyfikujący użytkownika, jaki istnieje w tabeli użytkowników. Skonstruowałem zapytanie:

UPDATE cms_comments JOIN cms_members AS user_original ON(user_original.user_id = comment_author) SET comment_author = (SELECT user_first.user_id FROM cms_members AS user_first WHERE user_first.user_name = user_original.user_name ORDER BY user_first.user_id ASC LIMIT 0, 1)

Usunięcie zdublowanych użytkowników było już tylko formalnością. Teraz się okaże, dlaczego zależało mi na wyciągnięciu dokładnie pierwszego rekordu reprezentującego “unikalnego” użytkownika: poniższe zapytanie (ALTER IGNORE TABLE ADD UNIQUE) usunie wszystkie kolejne rekordy oznaczone jako duplicated:

ALTER IGNORE TABLE cms_members ADD UNIQUE INDEX(user_name);

Krótki komentarz z manuala do ALTER TABLE:

IGNORE is a MySQL extension to standard SQL. It controls how ALTER TABLE works if there are duplicates on unique keys in the new table or if warnings occur when strict mode is enabled. If IGNORE is not specified, the copy is aborted and rolled back if duplicate-key errors occur. If IGNORE is specified, only the first row is used of rows with duplicates on a unique key, The other conflicting rows are deleted. Incorrect values are truncated to the closest matching acceptable value.

Pisząc ostatnie posty związane z bazami danych, mam nadzieję, że komuś się przydadzą.

Autor wpisu: Athlan, dodany: 02.07.2009 01:24, tagi: sql

Im więcej nietypowych rzeczy programuję, tym więcej nietypowych problemów musze pokonać. Co powiecie na sumę 2 liczb, z których jedna jest wartością NULL powstałą w wyniku działania SUM() lub pochodnych, gdzie nie odnaleziono żadnego rekordu.

Badamy:

SELECT 1+2+3 >> 6

SELECT 1+2+NULL >> NULL

SELECT COALESCE( NULL, 0 ) >> 0

Zatem analogicznie do powyższego przykładu:

UPDATE users SET user_points = user_points + COALESCE((SELECT SUM( ... ) WHERE ...), 0)

Punkty użytkownika już zawsze będą się sumowały poprawnie :-)

Autor wpisu: SongoQ, dodany: 01.07.2009 20:05, tagi: php, sql

postgresql

Wczorajszy dzień był “wysypem nowego oprogramowania” - nowego w sensie nowych wersji, np takich jak Firefox 3.5, PHP 5.3. Pisałem wczoraj o pgAdminie3 o wersji 1.10.0 a dzisiaj będzie o samej bazie danych PostgreSQL w wersji oznaczonej numerem 8.4.

W wersji PostgreSQL 8.4 zostały wprowadzone:

  • Równoległe przywracanie bazy, które wpływa na szybkość przywracania danych
  • Uprawnienia na kolumny
  • pg_migrator
  • Narzędzia diagnostyczne i administracyjne
  • Ulepszenia zwiazanych z PLSQL i SQL
  • Poprawki zwiazane z bezpieczeństwem bazy

Pełna lista zmian: http://www.postgresql.org/about/press/features84.html

Powiązane

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.