O vytváření nového sloupce jsme si povídali v odstavci o ALTER TABLE. Dozvěděli jsme se, jak přidat do tabulky sloupec s datovým typem, ale nic víc. Pokud chcete přidat k datovému typu nového sloupce (nebo i nějakého "starého", to je jedno) nějakou DEFAULT podmínku, musíte jí přiřadit až po přidání sloupce.
Ukážeme si příklad, kde do tabulky dluhy přidáme sloupec navrat_dluhu typu DATE a jehož defaultní hodnota bude deset dní od aktuálního času (current_date+10). V Postgresu se to dělá tak, že se nejdříve přidá sloupec, a teprve poté k němu DEFAULT podmínka. To se udělá pomocí ALTER TABLE následovně:
Jak vidíte, přibyl nám nový sloupec, který je celý prázdný i přes to, že má defaultní hodnotu. Defaultní hodnota se dosazuje pouze při vkládání nového řádku. Sloupec navrat_dluhu je nutné vyplnit tak, jak jsme to dělali v odstavci o ALTER TABLE.rimmer1=> ALTER TABLE dluhy ADD navrat_dluhu DATE; ALTER rimmer1=> ALTER TABLE dluhy ALTER navrat_dluhu SET DEFAULT current_date+10; ALTER rimmer1=> SELECT * FROM dluhy; jmeno | prijmeni | dluhy | zadluzen | navrat_dluhu --------+----------+--------+------------+-------------- Linus | Torvalds | 3105.0 | 2002-09-22 | Martin | Doktor | 1590.0 | 2002-09-22 | (2 rows)
rimmer1=> CREATE TABLE tabulka (cislo serial);
NOTICE: CREATE TABLE will create implicit sequence 'tabulka_cislo_seq' for SERIAL column 'tabulka.cislo'
NOTICE: CREATE TABLE / UNIQUE will create implicit index 'tabulka_cislo_key' for table 'tabulka'
CREATE
rimmer1=> \d tabulka
Table "tabulka"
Column | Type | Modifiers
-------+---------+-------------------------------------------------------
cislo | integer | not null default nextval('"tabulka_cislo_seq"'::text)
Unique keys: tabulka_cislo_key
Z výpisu tabulky tabulka je patrné, že sloupec cislo
je typu integer (!) s výše jmenovanými vlastnostmi. Funkce nextval obsahuje jako argument sekvenci tabulka_cislo_seq. Tato
sekvence se vytvořila automaticky při vytváření tabulky.
Pokud nyní budeme "sestrojovat" typ serial, vytvoříme nejdříve sloupec s typem integer a k němu přidáme defaultní hodnotu s funkcí nextval. Sekvenci si budeme muset vytvořit sami. K tomu slouží příkaz CREATE SEQUENCE. Pak také omezíme nový sloupec pouze na unikátní hodnoty pomocí příkazu CREATE INDEX. Nový sloupec bude tradičně prázdný, proto jej nakonec vyplníme.
rimmer1=> CREATE TABLE lide (jmeno VARCHAR(10));
CREATE
rimmer1=> INSERT INTO lide VALUES('Petr');
INSERT 16913 1
rimmer1=> INSERT INTO lide VALUES('Petr');
INSERT 16914 1
rimmer1=> INSERT INTO lide VALUES('Pavel');
INSERT 16915 1
rimmer1=> ALTER TABLE lide ADD id INTEGER;
ALTER
rimmer1=> ALTER TABLE lide ALTER id SET DEFAULT nextval('"lide_id_seq"'::text);
ALTER
rimmer1=> CREATE UNIQUE INDEX lide_id_key ON lide (id);
CREATE
rimmer1=> INSERT INTO lide values ('Martin');
ERROR: pg_aclcheck: class "lide_id_seq" not found
rimmer1=> CREATE SEQUENCE lide_id_seq;
CREATE
rimmer1=> INSERT INTO lide values ('Martin');
INSERT 16920 1
rimmer1=> SELECT * FROM lide;
jmeno | id
--------+----
Petr |
Petr |
Pavel |
Martin | 1
(4 rows)
Jelikož již v řádku se jménem Matin hodnota id je, a já ji z
nějakého důvodu nechci změnit (například se již odkazuje do nějaké
jiné tabulky), použiji při vyplňování podmínku WHERE.
rimmer1=> UPDATE lide SET id = nextval('"lide_id_seq"'::text)
rimmer1-> WHERE id IS NULL;
UPDATE 3
rimmer1=> SELECT * FROM lide;
jmeno | id
--------+----
Martin | 1
Petr | 2
Petr | 3
Pavel | 4
(4 rows)
