Úvod
Přidávání a odebírání záznamů z tabulek jsou některé z nejběžnějších operací, které databáze provádějí. Přidávání dat zahrnuje zadání názvů tabulek a sloupců, do kterých chcete přidat hodnoty, a také hodnot, které chcete zadat do jednotlivých polí. Odstranění záznamů zahrnuje identifikaci správného řádku nebo řádků a jejich odstranění z tabulky.
V této příručce se budeme zabývat tím, jak používat SQL INSERT
a DELETE
příkazy s PostgreSQL. To zahrnuje základní syntaxi, jak vrátit informace o datech, která byla zpracována, a jak přidat nebo odebrat více řádků v jednom příkazu.
Kontrola struktury tabulky
Před použitím INSERT
musíte znát strukturu tabulky, abyste mohli vyhovět požadavkům kladeným na sloupce, datové typy a omezení tabulky. Existuje několik různých způsobů, jak toho dosáhnout v závislosti na vašem databázovém klientovi.
Pokud používáte psql
příkazového řádku, nejpřímější způsob, jak najít tyto informace, je použít \d+
meta příkaz zabudovaný do nástroje.
Chcete-li například najít strukturu tabulky s názvem employee
, napsali byste toto:
\d+ employee
Table "public.employee" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description-------------+-----------------------------+-----------+----------+-----------------------------------------------+----------+--------------+------------- employee_id | integer | | not null | nextval('employee_employee_id_seq'::regclass) | plain | | first_name | character varying(45) | | not null | | extended | | last_name | character varying(45) | | not null | | extended | | last_update | timestamp without time zone | | not null | now() | plain | |Indexes: "employee_pkey" PRIMARY KEY, btree (employee_id) "idx_employee_last_name" btree (last_name)Triggers: last_updated BEFORE UPDATE ON employee FOR EACH ROW EXECUTE FUNCTION last_updated()Access method: heap
Výstup zobrazuje mimo jiné názvy sloupců tabulky, datové typy a výchozí hodnoty.
\d+
meta příkaz je dostupný pouze s psql
klienta, takže pokud používáte jiného klienta, možná budete muset přímo dotazovat informace v tabulce. Většinu relevantních informací můžete získat dotazem, jako je tento:
SELECT column_name, data_type, column_default, is_nullable, character_maximum_lengthFROM information_schema.columns WHERE table_name ='employee';
column_name | data_type | column_default | is_nullable | character_maximum_length-------------+-----------------------------+-----------------------------------------------+-------------+-------------------------- employee_id | integer | nextval('employee_employee_id_seq'::regclass) | NO | first_name | character varying | | NO | 45 last_name | character varying | | NO | 45 last_update | timestamp without time zone | now() | NO |(4 rows)
Ty by vám měly poskytnout dobrou představu o struktuře tabulky, abyste mohli správně vkládat hodnoty.
Pomocí INSERT
pro přidání nových záznamů do tabulek
SQL INSERT
příkaz se používá k přidání řádků dat do existující tabulky. Jakmile znáte strukturu tabulky, můžete sestavit příkaz, který odpovídá sloupcům tabulky s odpovídajícími hodnotami, které chcete vložit do nového záznamu.
Základní syntaxe příkazu vypadá takto:
INSERT INTO my_table(column1, column2)VALUES ('value1', 'value2');
Sloupce v seznamu sloupců přímo odpovídají hodnotám uvedeným v seznamu hodnot.
Ve výchozím nastavení INSERT
příkaz vrátí ID objektu (obvykle 0) a počet řádků, které byly úspěšně vloženy:
INSERT 0 1
Například vložení nového zaměstnance do employee
výše uvedené tabulce, mohli bychom napsat:
INSERT INTO employee(first_name, last_name)VALUES ('Bob', 'Smith');
INSERT 0 1
Zde uvádíme hodnoty pro first_name
a last_name
sloupce, zatímco ostatní sloupce ponecháte naplnit svými výchozími hodnotami. Pokud zadáte dotaz na tabulku, uvidíte, že byl přidán nový záznam:
SELECT * FROM employee;
employee_id | first_name | last_name | last_update-------------+------------+-----------+---------------------------- 1 | Bob | Smith | 2020-08-19 21:07:00.952454(1 row)
Vracení dat z INSERT
prohlášení
Pokud chcete další informace o datech, která byla přidána do tabulky, můžete zahrnout RETURNING
klauzule na konci vašeho prohlášení. RETURNING
klauzule určuje sloupce k zobrazení záznamů, které byly právě vloženy.
Chcete-li například zobrazit všechny sloupce pro záznamy, které byly právě vloženy, můžete zadat něco takového:
INSERT INTO my_table(column_name, column_name_2)VALUES ('value', 'value2')RETURNING *;
column_name | column_name_2-------------+--------------- value | value2(1 row)INSERT 0 1
Pomocí employee
tabulka, bude to vypadat nějak takto:
INSERT INTO employee(first_name, last_name)VALUES ('Sue', 'Berns')RETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+-------------------------- 2 | Sue | Berns | 2020-08-19 21:15:01.7622(1 row)INSERT 0 1
Můžete se také rozhodnout vrátit pouze určité sloupce z vložení. Zde nás například zajímá pouze ID nového zaměstnance:
INSERT INTO employee(first_name, last_name)VALUES ('Delores', 'Muniz')RETURNING employee_id;
employee_id ------------- 3(1 row)INSERT 0 1
Jako obvykle můžete také použít aliasy sloupců ke změně názvů sloupců ve výstupu:
INSERT INTO employee(first_name, last_name)VALUES ('Simone', 'Kohler')RETURNING employee_id AS "Employee ID";
Employee ID------------- 4(1 row)INSERT 0 1
Pomocí INSERT
přidat více řádků najednou
Vkládání záznamů po jednom příkazu je časově náročnější a méně efektivní než vkládání více řádků najednou. PostgreSQL umožňuje zadat více řádků pro přidání do stejné tabulky. Každý nový řádek je zapouzdřen v závorkách, přičemž každá sada závorek je oddělena čárkami.
Základní syntaxe pro vkládání více záznamů vypadá takto:
INSERT INTO my_table(column_name, column_name_2)VALUES ('value', 'value2'), ('value3', 'value4'), ('value5', 'value6');
Pro employee
tabulky, na kterou jsme odkazovali, můžete přidat čtyři nové zaměstnance v jediném příkazu zadáním:
INSERT INTO employee(first_name, last_name)VALUES ('Abigail', 'Spencer'), ('Tamal', 'Wayne'), ('Katie', 'Singh'), ('Felipe', 'Espinosa');
INSERT 0 4
Pomocí DELETE
k odstranění řádků z tabulek
SQL DELETE
příkaz se používá k odstranění řádků z tabulek, funguje jako doplňková akce k INSERT
. Chcete-li odstranit řádky z tabulky, musíte určit řádky, na které chcete cílit, zadáním kritérií shody v WHERE
doložka.
Základní syntaxe vypadá takto:
DELETE FROM my_tableWHERE <condition>;
Například do každého řádku v našem employee
tabulka, která má své first_name
nastavte na Abigail
, mohli bychom napsat toto:
DELETE FROM employeeWHERE first_name = 'Abigail';
DELETE 1
Vrácená hodnota zde označuje, že DELETE
příkaz byl zpracován, přičemž byl odstraněn jeden řádek.
Vracení dat z DELETE
prohlášení
Stejně jako u INSERT
můžete vrátit dotčené řádky nebo konkrétní sloupce z odstraněných řádků přidáním RETURNING
klauzule:
DELETE FROM my_tableWHERE <condition>RETURNING *;
Můžeme například ověřit, že byl odstraněn správný záznam, vrácením všech sloupců od smazaného employee
zde:
DELETE FROM employeeWHERE last_name = 'Smith'RETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+---------------------------- 1 | Bob | Smith | 2020-08-19 21:07:00.952454(1 row)DELETE 1
Pomocí DELETE
k odstranění více řádků najednou
Pomocí DELETE
můžete odstranit více položek najednou manipulací s kritérii výběru zadanými v WHERE
doložka.
Chcete-li například odstranit více řádků podle ID, můžete zadat něco takového:
DELETE FROM employeeWHERE employee_id in (3,4)RETURNING *;
employee_id | first_name | last_name | last_update -------------+------------+-----------+---------------------------- 3 | Delores | Muniz | 2020-08-19 21:17:06.943608 4 | Simone | Kohler | 2020-08-19 21:19:19.298833(2 rows)DELETE 2
Můžete dokonce vynechat WHERE
klauzule k odstranění všech řádků z dané tabulky:
DELETE FROM employeeRETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+---------------------------- 2 | Sue | Berns | 2020-08-19 21:15:01.7622 6 | Tamal | Wayne | 2020-08-19 22:11:53.408531 7 | Katie | Singh | 2020-08-19 22:11:53.408531 8 | Filipe | Espinosa | 2020-08-19 22:11:53.408531(4 rows)DELETE 4
Uvědomte si však, že pomocí DELETE
vyprázdnit tabulku dat není tak efektivní jako TRUNCATE
příkaz, který může odstranit data bez skenování tabulky.
Závěr
V tomto článku jsme představili některé z nejdůležitějších příkazů pro řízení toho, jaká data jsou ve vašich tabulkách PostgreSQL. INSERT
příkaz lze použít k přidání nových dat do tabulek, zatímco příkaz DELETE
příkaz určuje, které řádky mají být odstraněny. Oba příkazy jsou schopny vrátit řádky, které ovlivňují, a mohou pracovat na více řádcích najednou.
Tyto dva příkazy jsou primární mechanismy používané ke správě zvýšení nebo snížení počtu záznamů, které tabulka obsahuje. Získání přehledu o jejich základní syntaxi a také o způsobech, jak je lze kombinovat s jinými klauzulemi, vám umožní naplnit a vyčistit tabulky podle potřeby.