Generator schematu bazy danych
Wiele tabel, klucze obce i indeksy w jednym skrypcie SQL dla MySQL, MariaDB lub PostgreSQL
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Format: tabela: kolumna:typ|modyfikatory, kolumna:typ|modyfikatory. Kolumny oddzielaj przecinkiem i spacją.
Lista typów i modyfikatorów jest w ściądze pod wynikiem. Ctrl+Enter generuje schemat.
Schemat SQL gotowy
Łącznie 10 kolumn. Kod dla MySQL i MariaDB (InnoDB, utf8mb4): wklej go w phpMyAdmin, Adminer lub konsolę mysql.
Kolumny
Klucze obce
ALTER TABLE … FOREIGN KEY
Indeksy
poza pk i unique
Ostrzeżenia
schemat bez zastrzeżeń
Kod SQL · MySQL / MariaDB
| Tabela | Kolumny | Klucz główny | Powiązania (klucze obce) |
|---|---|---|---|
| users | 5 | id | — |
| orders | 5 | id | user_id → users.id |
Ściąga: typy kolumn w MySQL i PostgreSQL
| Wpisz w polu | MySQL / MariaDB | PostgreSQL |
|---|---|---|
| bigint | BIGINT | BIGINT |
| int | INT | INTEGER |
| smallint | SMALLINT | SMALLINT |
| tinyint | TINYINT | SMALLINT |
| boolean | TINYINT(1) | BOOLEAN |
| decimal|12,2 | DECIMAL(12,2) | NUMERIC(12,2) |
| string|255 | VARCHAR(255) | VARCHAR(255) |
| char|2 | CHAR(2) | CHAR(2) |
| uuid | CHAR(36) | UUID |
| text | TEXT | TEXT |
| longtext | LONGTEXT | TEXT |
| timestamp | TIMESTAMP | TIMESTAMP |
| datetime | DATETIME | TIMESTAMP |
| date | DATE | DATE |
| time | TIME | TIME |
| json | JSON | JSONB |
| float | FLOAT | REAL |
| double | DOUBLE | DOUBLE PRECISION |
Modyfikatory kolumn
| Modyfikator | Co robi | Przykład |
|---|---|---|
| pk | Klucz główny (NOT NULL). Pojedyncza kolumna całkowita bez fk dostaje autonumerację. Kilka kolumn z pk = klucz złożony. | id:bigint|pk |
| auto | Autonumeracja: AUTO_INCREMENT w MySQL, IDENTITY w PostgreSQL. Tylko typy całkowite. | nr:int|auto|unique |
| notnull | Wartość wymagana (NOT NULL). | name:string|255|notnull |
| unique | Wartości nie mogą się powtarzać (UNIQUE). | email:string|255|unique |
| index | Zwykły indeks przyspieszający wyszukiwanie. | status:string|20|index |
| default:wartość | Wartość domyślna: tekst, liczba, null, true/false (boolean), now (bieżący czas). | status:string|20|default:new |
| fk:tabela.kolumna | Klucz obcy do innej tabeli; samo fk:tabela oznacza kolumnę id. | user_id:bigint|fk:users.id |
| liczba albo liczba,liczba | Długość VARCHAR/CHAR albo precyzja i skala DECIMAL. | price:decimal|10,2 |
Klucze obce i ON DELETE
CASCADE usuwa wiersze zależne razem z rekordem nadrzędnym: skasowanie użytkownika skasuje też jego zamówienia. RESTRICT i NO ACTION blokują usunięcie, dopóki istnieją powiązane wiersze. SET NULL zeruje kolumnę klucza obcego, więc ta kolumna nie może mieć notnull. Typ kolumny klucza obcego musi być zgodny z kolumną, do której się odwołuje (np. BIGINT i BIGINT).
Kiedy dodać indeks
Indeks przyspiesza wyszukiwanie, sortowanie i złączenia po kolumnie (WHERE, ORDER BY, JOIN), ale spowalnia zapis i zajmuje miejsce. Dodawaj index do kolumn, po których filtrujesz. Klucz główny i unique mają indeks z definicji. InnoDB sam tworzy indeks dla klucza obcego, PostgreSQL nie, dlatego w tym dialekcie generator dodaje go za Ciebie.
Kodowanie utf8mb4
utf8mb4 zapisuje wszystkie znaki Unicode, także emoji. W MySQL utf8 to alias utf8mb3 (do 3 bajtów na znak), który emoji nie zapisze, a latin1 nie obejmuje liter takich jak ą, ę czy ł. W PostgreSQL kodowanie ustala się dla całej bazy, dlatego przy tym dialekcie opcja znika.
Kolejność tabel i importu
Generator najpierw tworzy wszystkie tabele, potem indeksy, a na końcu dodaje klucze obce przez ALTER TABLE. Dzięki temu kolejność wierszy w polu nie ma znaczenia, a tabela może wskazywać tabelę zdefiniowaną niżej. Nazwy tabel i kolumn mogą zawierać tylko litery bez polskich znaków, cyfry i podkreślnik.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator schematu bazy danych
Opisz strukturę w prostym formacie tekstowym, a generator schematu bazy danych przygotuje kompletny skrypt DDL: instrukcje CREATE TABLE, indeksy i klucze obce. Kod wygenerujesz dla MySQL i MariaDB albo dla PostgreSQL, a potem skopiujesz go lub pobierzesz jako plik schemat.sql.
Format
Jedna tabela zajmuje jeden wiersz:
tabela: kolumna:typ|modyfikatory, kolumna2:typ|modyfikatory
Przykład:
users: id:bigint|pk|auto, email:string|255|unique|notnullorders: id:bigint|pk|auto, user_id:bigint|fk:users.id, total:decimal|12,2
Kolumny oddzielasz przecinkiem i spacją, a typ od modyfikatorów pionową kreską. Wiersze zaczynające się od #, -- lub // są komentarzami i zostają pominięte. Nazwy tabel i kolumn mogą zawierać tylko litery bez polskich znaków, cyfry i podkreślnik; inne znaki generator usuwa i zgłasza ostrzeżenie. Jednorazowo przetworzysz do 100 tabel i 20 000 znaków definicji. Na start masz trzy gotowe przykłady: blog, sklep oraz projekty z zadaniami.
Modyfikatory
| Modyfikator | Efekt |
|---|---|
| pk | klucz główny (zawsze NOT NULL); pk przy kilku kolumnach tworzy klucz złożony |
| auto | autonumeracja: AUTO_INCREMENT w MySQL, GENERATED BY DEFAULT AS IDENTITY w PostgreSQL; tylko typy całkowite |
| notnull | NOT NULL |
| null | kolumna dopuszcza NULL (tak jest też bez modyfikatora) |
| unique | UNIQUE w definicji kolumny |
| index | osobna instrukcja CREATE INDEX o nazwie idx_tabela_kolumna |
| default:wartość | wartość domyślna: liczba, tekst, null, true/false dla boolean, now dla timestamp i datetime |
| fk:tabela.kolumna | klucz obcy z akcją ON DELETE wybraną w opcjach; samo fk:tabela wskazuje kolumnę id |
| 255 albo 12,2 | długość VARCHAR i CHAR albo precyzja i skala DECIMAL |
Typy
bigint, int (integer), smallint, tinyint, decimal (numeric), string (varchar), char, uuid, text, longtext, boolean (bool), timestamp, datetime, date, time, json, float, double. Bez podanej długości string daje VARCHAR(255), char – CHAR(1), a decimal – DECIMAL(12,2). Nieznany typ zamienia się na VARCHAR(255) i trafia na listę ostrzeżeń.
Jak działa generator schematu bazy danych
Narzędzie czyta tekst linia po linii. Każda linia to jedna tabela: nazwa stoi przed pierwszym dwukropkiem, a po nim lista kolumn. Separatorem kolumn jest przecinek, po którym stoi spacja, dlatego zapis decimal|12,2 bez spacji pozostaje jedną kolumną i daje DECIMAL(12,2).
Typy są tłumaczone na składnię wybranej bazy. W MySQL boolean staje się TINYINT(1), uuid – CHAR(36), a json – JSON. W PostgreSQL te same zapisy dają BOOLEAN, UUID i JSONB, decimal zamienia się na NUMERIC, a nazwy są ujmowane w cudzysłowy zamiast odwrotnych apostrofów. Pojedyncza kolumna całkowita z pk, która nie jest kluczem obcym, dostaje autonumerację nawet bez modyfikatora auto. Jeśli tabela nie ma żadnego pk, a ma kolumnę id, kluczem głównym zostaje id.
Skrypt powstaje w trzech blokach. Najpierw idą wszystkie instrukcje CREATE TABLE, potem indeksy, a na końcu klucze obce dopisywane przez ALTER TABLE ADD CONSTRAINT. Definicja może więc odwoływać się do tabeli, która w polu stoi niżej, i nie trzeba ręcznie sortować wierszy. W MySQL każda tabela dostaje wybrany silnik (InnoDB lub MyISAM) i kodowanie (utf8mb4, utf8 lub latin1). Indeksy i klucze obce możesz wyłączyć osobnymi polami wyboru.
Pod wynikiem widać liczbę tabel, kolumn, kluczy obcych i indeksów, tabelę powiązań oraz listę ostrzeżeń. Generator zgłasza między innymi klucz obcy do nieistniejącej tabeli lub kolumny, różne typy po obu stronach relacji, ON DELETE SET NULL na kolumnie z notnull, MyISAM z kluczami obcymi i kodowanie bez pełnego Unicode.
Przykład: domyślny schemat krok po kroku
- Po wejściu na stronę w polu jest przykład z dwiema tabelami. users ma kolumny id, name, email, password i created_at, a orders – id, user_id, total, status i created_at.
- Parser wyodrębnia dziesięć definicji kolumn, ponieważ 5 + 5 = 10.
- Typy zostają zamienione: bigint na BIGINT, string|255 na VARCHAR(255), string|20 na VARCHAR(20), decimal|12,2 na DECIMAL(12,2), a timestamp na TIMESTAMP.
- Obie kolumny id dostają NOT NULL i AUTO_INCREMENT oraz linię PRIMARY KEY. Kolumna email otrzymuje NOT NULL UNIQUE, status – DEFAULT 'pending', a NOT NULL pojawia się też przy name, password i total.
- Klucz obcy orders.user_id → users.id trafia na koniec skryptu jako instrukcja ALTER TABLE z ograniczeniem fk_orders_user_id.
- Wynik dla MySQL: 2 tabele, 10 kolumn, 1 klucz obcy, 0 indeksów i brak ostrzeżeń. Po przełączeniu na PostgreSQL licznik indeksów pokaże 1, bo generator doda CREATE INDEX na orders.user_id.
Fragment wyniku dla MySQL z domyślnymi opcjami:
CREATE TABLE `orders` (`id` BIGINT NOT NULL AUTO_INCREMENT,`user_id` BIGINT,`total` DECIMAL(12,2) NOT NULL,`status` VARCHAR(20) DEFAULT 'pending',`created_at` TIMESTAMP,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `orders` ADD CONSTRAINT `fk_orders_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE;
Mapowanie zapisu na obiekty w bazie
| Zapis w narzędziu | MySQL / MariaDB | PostgreSQL | Kiedy używać |
|---|---|---|---|
| string|255 | VARCHAR(255) | VARCHAR(255) | Teksty o znanej, ograniczonej długości |
| text | TEXT | TEXT | Dłuższe opisy bez sztywnego limitu znaków |
| bigint|pk|auto | BIGINT NOT NULL AUTO_INCREMENT | BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY | Klucz główny rosnący automatycznie |
| decimal|12,2 | DECIMAL(12,2) | NUMERIC(12,2) | Kwoty: 10 cyfr przed przecinkiem i 2 po |
| boolean | TINYINT(1) | BOOLEAN | Flagi tak lub nie |
| uuid | CHAR(36) | UUID | Identyfikatory generowane poza bazą |
| json | JSON | JSONB | Dane o zmiennej strukturze |
| timestamp|default:now | TIMESTAMP DEFAULT CURRENT_TIMESTAMP | TIMESTAMP DEFAULT CURRENT_TIMESTAMP | Znacznik czasu utworzenia rekordu |
| fk:users.id | ALTER TABLE … FOREIGN KEY … REFERENCES `users` (`id`) | ALTER TABLE … FOREIGN KEY … REFERENCES "users" ("id") | Powiązanie z rekordem nadrzędnym |
| unique | UNIQUE | UNIQUE | Wartości, które nie mogą się powtarzać |
Praktyczne wskazówki
- Podawaj długość przy string. Zapis string|20 mówi wprost, ile znaków przewidujesz; bez liczby generator wstawi VARCHAR(255).
- Kolumna klucza obcego musi mieć ten sam typ co kolumna docelowa, np. BIGINT i BIGINT. Przy niezgodności baza odrzuci ALTER TABLE, a generator ostrzega o tym przed importem.
- Modyfikator index przy kolumnie z unique albo przy pierwszej kolumnie klucza głównego nic nie zmienia: obie mają indeks z definicji, więc generator go pomija.
- Kolumna z fk bez notnull dopuszcza rekord bez powiązania. Dodaj notnull, gdy relacja jest obowiązkowa, ale nie łącz go z ON DELETE SET NULL.
- Index dodawaj do kolumn, po których filtrujesz lub sortujesz, np. status czy due_date. InnoDB sam zakłada indeks na kolumnie klucza obcego, PostgreSQL nie, dlatego w tym dialekcie generator dopisuje go za Ciebie.
- Trzymaj definicję w kontroli wersji. Kilka linii opisu struktury łatwiej przejrzeć niż ręcznie pisane instrukcje rozsiane po migracjach.
Czego narzędzie nie uwzględnia
- Skrypt tworzy nowe tabele. Nie zmieni działającej tabeli ani nie przeniesie danych; zmiany w istniejącej bazie przygotujesz w generatorze SQL ALTER TABLE.
- Akcja ON DELETE (CASCADE, RESTRICT, SET NULL lub NO ACTION) jest wspólna dla wszystkich kluczy obcych w skrypcie, a klauzula ON UPDATE nie jest dodawana.
- Klucz złożony da się zapisać tylko jako klucz główny. Klucze obce, unique i indeksy dotyczą zawsze jednej kolumny.
- Brakuje typów enum i blob, atrybutu UNSIGNED, kolacji i komentarzy kolumn. Takie elementy trzeba dopisać ręcznie w gotowym pliku.
- Generator nie sprawdza rozmiaru wiersza ani długości indeksu, a zbyt długie nazwy skraca do 64 znaków w MySQL i 63 w PostgreSQL. Wynik najlepiej uruchomić najpierw na kopii bazy.
Najczęstsze pytania
Czy wygenerowany skrypt mogę od razu uruchomić w MySQL?
Tak, jeśli lista ostrzeżeń jest pusta. Kod wklejasz w phpMyAdmin, Adminer lub konsolę mysql albo importujesz pobrany plik schemat.sql; tabele, indeksy i klucze obce są ułożone w kolejności, która wykona się bez błędów.
Czy generator obsługuje PostgreSQL?
Tak. Po wybraniu PostgreSQL autonumeracja to GENERATED BY DEFAULT AS IDENTITY, json staje się JSONB, a kolumny kluczy obcych dostają osobne indeksy. Opcje silnika i kodowania znikają, bo w PostgreSQL kodowanie ustala się dla całej bazy.
Jak zapisać klucz obcy do innej tabeli?
Modyfikatorem fk:tabela.kolumna, na przykład fk:users.id; samo fk:users również wskaże kolumnę id. Zachowanie przy usuwaniu rekordu nadrzędnego wybierasz w polu ON DELETE.
Czy kolejność tabel ma znaczenie?
Nie. Klucze obce są dodawane na końcu skryptu, więc tabela może wskazywać tabelę zdefiniowaną niżej.
Jak zrobić tabelę łączącą relację wiele do wielu?
Dodaj pk i fk do obu kolumn, np. project_user: project_id:bigint|pk|fk:projects.id, user_id:bigint|pk|fk:users.id. Powstanie złożony klucz główny bez autonumeracji; gotowy wzór jest w przykładzie „Projekty i zadania”.
Dlaczego przecinek w decimal|12,2 nie rozbija definicji kolumny?
Kolumny rozdziela przecinek ze spacją, a w 12,2 spacji nie ma. Jeśli napiszesz 12, 2, generator potraktuje „2” jako nową kolumnę.