🛢️
PostgreSQL
Grokking Algorithm
  • Content
  • Environment
  • Getting Started
    • Introduction
      • What is PostgreSQL
      • Introduction to PostgreSQL sample database
    • Postgres on Windows
      • Install PostgreSQL on Windows
      • Connect to PostgreSQL database server
      • Load the sample database into the PostgreSQL database server
    • Postgres on Linux
    • Install PostgreSQL on macOS
  • Basic
    • Querying Data
      • SELECT
      • Column alias
      • ORDER BY
      • SELECT DISTINCT
    • Filtering Data
      • WHERE
      • AND
      • OR
      • LIMIT
      • FETCH
      • IN
      • BETWEEN
      • LIKE
      • IS NULL
    • Joining Multiple tables
      • Joins
      • Table aliases
      • INNER JOIN
      • LEFT JOIN
      • RIGHT JOIN
      • SELF JOIN
      • FULL OUTER JOIN
      • CROSS JOIN
      • NATURAL JOIN
    • Grouping data
      • GROUP BY
      • HAVING
    • Set Operations
      • UNION
      • INTERSECT
      • EXCEPT
    • Grouping sets, Cube, and Rollup
      • Grouping sets
      • CUBE
      • ROLLUP
    • Subquery
      • Subquery
      • ANY
      • ALL
      • EXISTS
    • Common Table Expressions
      • PostgreSQL CTE
      • Recursive query using CTEs
    • Modifying Data
      • Insert
      • Insert multiple rows
      • Update
      • Update join
      • Delete
      • Upsert
    • Transactions
      • PostgreSQL Transaction
    • Import & Export Data
      • Import CSV file into Table
      • Export PostgreSQL Table to CSV file
    • Managing Tables
      • Data types
      • Create a table
      • Select into
      • Create table as
      • Auto-increment
      • Sequences
      • Identity column
      • Alter table
      • Rename table
      • Add column
      • Drop column
      • Change column data type
      • Rename column
      • Drop table
      • Truncate table
      • Temporary table
      • Copy a table
    • Understanding PostgreSQL constraints
      • Primary key
      • Foreign key
      • UNIQUE constraint
      • CHECK constraint
      • NOT NULL constraint
    • PostgreSQL Data Types in Depth
      • Boolean
      • CHAR, VARCHAR and TEXT
      • NUMERIC
      • Integer
      • DATE
      • Timestamp
      • Interval
      • TIME
      • UUID
      • Array
      • hstore
      • JSON
      • User-defined data types
  • Advanced
  • PG-PGSQL
  • Functions
  • Adminstration
  • API
Powered by GitBook
On this page

Was this helpful?

Edit on GitHub
  1. Basic
  2. Modifying Data

Upsert

Ushbu qo'llanmada siz qo'shilayotgan qator jadvalda allaqachon mavjud bo'lsa, ma'lumotlarni kiritish yoki yangilash uchun PostgreSQL Upsert xususiyatidan qanday foydalanishni o'rganasiz.

Relyatsion ma'lumotlar bazalarida Upsert atamasi birlashma deb ataladi. G'oya shundan iboratki, siz jadvalga yangi qator qo'shganingizda, PostgreSQL agar u allaqachon mavjud bo'lsa, qatorni yangilaydi, aks holda u yangi qatorni kiritadi. Shuning uchun biz harakatni yuqori deb ataymiz (yangilash yoki qo'shish birikmasi).

PostgreSQL-da yuqoriga qo'yish xususiyatidan foydalanish uchun siz INSERT ON CONFLICT bayonotidan quyidagi tarzda foydalanasiz:

INSERT INTO table_name(column_list) 
VALUES(value_list)
ON CONFLICT target action;

PostgreSQL upsert qo'yish xususiyatini qo'llab-quvvatlash uchun INSERT bayonotiga ON CONFLICT target action bandini qo'shdi.

Ushbu bayonotda target quyidagilardan biri bo'lishi mumkin:

  • (column_name) - ustun nomi.

  • ON CONSTRAINT constraint_name - bu erda cheklov nomi UNIQUE cheklovning nomi bo'lishi mumkin.

  • WHERE predikati -- predikatli WHERE gap.

action quyidagilardan biri bo'lishi mumkin:

  • DO NOTHING - agar qator jadvalda allaqachon mavjud bo'lsa, hech narsa qilmang degan ma'noni anglatadi.

  • DO UPDATE SET column_1 = value_1, .. WHERE condition -- jadvaldagi ayrim maydonlarni yangilang.

E'tibor bering, ON CONFLICT bandi faqat PostgreSQL 9.5 da mavjud. Agar oldingi versiyadan foydalanayotgan bo'lsangiz, yuqoriga qo'yish xususiyatiga ega bo'lish uchun vaqtinchalik yechim kerak bo'ladi.

Agar siz MySQL bilan ham ishlayotgan bo'lsangiz, yuqoriga qo'yish xususiyati MySQL-dagi ikki nusxadagi kalitlarni yangilash bayonotiga qo'shishga o'xshashligini topasiz.

PostgreSQL yuklash misollari

Quyidagi bayonot PostgreSQL upsert xususiyatini namoyish qilish uchun customers deb nomlangan yangi jadval yaratadi.

DROP TABLE IF EXISTS customers;

CREATE TABLE customers (
	customer_id serial PRIMARY KEY,
	name VARCHAR UNIQUE,
	email VARCHAR NOT NULL,
	active bool NOT NULL DEFAULT TRUE
);

customers jadvali to'rtta ustundan iborat: customer_id, name, email va active. name ustunida mijozlar nomlarining o'ziga xosligini kafolatlash uchun noyob cheklov mavjud.

Quyidagi INSERT iborasi customers jadvaliga ba'zi qatorlarni kiritadi.

INSERT INTO 
    customers (name, email)
VALUES 
    ('IBM', 'contact@ibm.com'),
    ('Microsoft', 'contact@microsoft.com'),
    ('Intel', 'contact@intel.com');

Aytaylik, Microsoft aloqa elektron pochta manzilini contact@microsoft.com manzilidan hotline@microft.com ga o'zgartiradi, biz UNI UPDATE bayonoti yordamida yangilashimiz mumkin. Biroq, yuqoriga qo'yish xususiyatini namoyish qilish uchun biz quyidagi INSERT ON CONFLICT bayonotidan foydalanamiz:

INSERT INTO customers (NAME, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT ON CONSTRAINT customers_name_key 
DO NOTHING;

Bayonotda agar mijoz nomi customers jadvalida mavjud boʻlsa, unga eʼtibor bermaslik (hech narsa qilmang) koʻrsatilgan.

Quyidagi bayonot yuqoridagi bayonotga ekvivalentdir, lekin u INSERT iborasining maqsadi sifatida noyob cheklash nomi o'rniga name ustunidan foydalanadi.

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO NOTHING;

Aytaylik, siz allaqachon mavjud bo'lgan mijozni kiritishda yangi elektron pochtani eski elektron pochta manzili bilan birlashtirmoqchisiz, bu holda siz INSERT iborasining harakati sifatida UPDATE bandidan foydalanasiz:

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO 
   UPDATE SET email = EXCLUDED.email || ';' || customers.email;

Chiqish:

INSERT 0 1

Quyidagi bayonot yuqorilikni tasdiqlaydi:

Ushbu qo'llanmada siz INSERT ON CONFLICT bayonotidan foydalangan holda PostgreSQL-ni yangilash xususiyati haqida bilib oldingiz.

PreviousDeleteNextTransactions

Last updated 1 year ago

Was this helpful?

©

postgresqltutorial.com
output
output