PostgreSQL - tworzenie tabeli - kilka pytań

0

Witam,
w końcu mam okazję porzucić MySQL'a i przesiąść na 'lepszy' produkt - PostgreSQL.

Mimo, że we wszystkich bazach danych tabele tworzy się prawie identycznie, to jednak mam kilka pytań odnośnie szczegółów charakterystycznych dla Postgres'a..

Chciałbym zacząć od analogii.. W MySQL tworzenie tabeli wykonywałem według następującego schematu:

CREATE TABLE `person` (
  `person_id` int(10) NOT NULL AUTO_INCREMENT,
  `firstName` varchar(50) NOT NULL,
  `secondName` varchar(50) NOT NULL,
  `address` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`person_id`)
); 

Jak to teraz powinno wyglądać w PostgreSQL ? Chodzi mi przede wszystkim o kwestie klucza głownego..

Przytaczając dokumentacje: http://www.postgresql.org/docs/9.1/static/datatype-numeric.html

8.1.4

In the current implementation, specifying:

CREATE TABLE tablename (
    colname SERIAL
);

is equivalent to specifying:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

Spotkałem się również z zastosowaniem polecenia PRIMARY KEY lub kombinowaniem z **UNIQUE **i **CONSTRAINT **dla danej kolumny..

Teraz pytanie - co stosować ? Jaką wersje ? (i czy ma to jakieś znaczenie ?) Ogólnie sam chciałem napisać to możliwie "niezależnie" w stosunku do składni Postgres'a, aby było to możliwie jak najbardziej przenośnie (przełożone na inne bazy danych).. ale czy w sumie ma to sens ?..

0

Napisz... W ANSI SQL. Choć chyb się nie da, bo tam SERIAL chyba nie ma.
Możesz napisać tak:

CREATE TABLE person (
  person_id BIGSERIAL NOT NULL PRIMARY KEY,
  firstName VARCHAR(50) NOT NULL,
  secondName VARCHAR(50) NOT NULL,
  addres VARCHAR(50) NULL,
  email VARCHAR(50) NULL UNIQUE
  );

A wersja? Im nowsza tym lepsza. W 9.3 jest np fajny postgres_fdw... Do dblinka jakoś się nie przekonałem...

0

@Marcin.Miga - piszą "wersja" miałem na myśli, czy lepiej używać typu SERIAL, czy funkcji NEXTVAL w połączeniu z SEQUENCE, czy może robić to tak jak Ty podałeś ? I czy są jakieś "odmienne" skutki stosowania danej wersji..

1

SERIAL jest synonimem do INT + NEXTVAL. Czyli de facto to to samo. Pełną wersję możesz pisać gdy chcesz po swojemu nazywać sequencery lub gdy chcesz jednego sequencera przydzielić do kilku tabel...

1 użytkowników online, w tym zalogowanych: 0, gości: 1