postgresql
सम्मिलित करें
खोज…
बेसिक इंसर्ट
मान लीजिए कि हमारे पास एक साधारण टेबल है, जिसे व्यक्ति कहते हैं:
CREATE TABLE person (
person_id BIGINT,
name VARCHAR(255).
age INT,
city VARCHAR(255)
);
सबसे मूल सम्मिलित में सभी मानों को सम्मिलित करना शामिल है:
INSERT INTO person VALUES (1, 'john doe', 25, 'new york');
यदि आप केवल विशिष्ट कॉलम सम्मिलित करना चाहते हैं, तो आपको स्पष्ट रूप से संकेत देना होगा कि कौन से कॉलम हैं:
INSERT INTO person (name, age) VALUES ('john doe', 25);
ध्यान दें कि यदि कोई बाधा तालिका में मौजूद है, जैसे कि NULL, तो आपको उन कॉलमों को किसी भी स्थिति में शामिल करने की आवश्यकता नहीं होगी।
कई पंक्तियों को सम्मिलित करना
आप एक ही समय में डेटाबेस में कई पंक्तियाँ सम्मिलित कर सकते हैं:
INSERT INTO person (name, age) VALUES
('john doe', 25),
('jane doe', 20);
चयन से डालें
आप चुनिंदा विवरण के परिणाम के रूप में तालिका में डेटा सम्मिलित कर सकते हैं:
INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;
ध्यान दें कि चयन का प्रक्षेपण सम्मिलित करने के लिए आवश्यक कॉलम से मेल खाना चाहिए। इस स्थिति में, tmp_person
तालिका में person
के समान कॉलम हैं।
COPY का उपयोग करके डेटा डालें
COPY PostgreSQL का बल्क-इंसर्ट मैकेनिज्म है। यह फ़ाइलों और तालिकाओं के बीच डेटा स्थानांतरित करने के लिए एक सुविधाजनक तरीका है, लेकिन यह एक समय में कुछ हजार पंक्तियों से अधिक जोड़ने पर INSERT
तुलना में बहुत तेज़ है।
चलो नमूना डेटा फ़ाइल बनाकर शुरू करते हैं।
cat > samplet_data.csv
1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit
और हमें दो कॉलम तालिका की आवश्यकता है जिसमें इस डेटा को आयात किया जा सकता है।
CREATE TABLE copy_test(id int, name varchar(8));
अब वास्तविक कॉपी ऑपरेशन, यह तालिका में छह रिकॉर्ड बनाएगा।
COPY copy_test FROM '/path/to/file/sample_data.csv' DELIMITER ',';
डिस्क पर किसी फ़ाइल का उपयोग करने के बजाय, stdin
से डेटा सम्मिलित कर सकते हैं
COPY copy_test FROM stdin DELIMITER ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 7,Amol
>> 8,Amar
>> \.
Time: 85254.306 ms
SELECT * FROM copy_test ;
id | name
----+--------
1 | Yogesh
3 | Varun
5 | Hari
7 | Amol
2 | Raunak
4 | Kamal
6 | Amit
8 | Amar
इसके अलावा, आप नीचे दी गई तालिका में फ़ाइल से डेटा कॉपी कर सकते हैं:
COPY copy_test TO 'path/to/file/sample_data.csv' DELIMITER ',';
COPY के बारे में अधिक जानकारी के लिए आप यहाँ देख सकते हैं
INSERT डेटा और रिटायरिंग मान
यदि आप एक ऑटो वेतन वृद्धि कॉलम के साथ तालिका में डेटा सम्मिलित कर रहे हैं और यदि आप ऑटो वेतन वृद्धि कॉलम का मूल्य प्राप्त करना चाहते हैं।
मान लें कि आपके पास my_table
नामक एक तालिका है:
CREATE TABLE my_table
(
id serial NOT NULL, -- serial data type is auto incrementing four-byte integer
name character varying,
contact_number integer,
CONSTRAINT my_table_pkey PRIMARY KEY (id)
);
यदि आप my_table
में डेटा my_table
और उस पंक्ति की आईडी प्राप्त करना चाहते हैं:
INSERT INTO my_table(name, contact_number) VALUES ( 'USER', 8542621) RETURNING id;
ऊपर क्वेरी उस पंक्ति की आईडी वापस कर देगी जहां नया रिकॉर्ड डाला गया था।
फ़ाइल में डेटा का चयन करें।
आप टेबल को कॉपी करके फाइल में पेस्ट कर सकते हैं।
postgres=# select * from my_table;
c1 | c2 | c3
----+----+----
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
4 | 4 | 4
5 | 5 |
(5 rows)
postgres=# copy my_table to '/home/postgres/my_table.txt' using delimiters '|' with null as 'null_string' csv header;
COPY 5
postgres=# \! cat my_table.txt
c1|c2|c3
1|1|1
2|2|2
3|3|3
4|4|4
5|5|null_string
UPSERT - INSERT ... ON CONFLICT DO UPDATE ...
के बाद से संस्करण 9.5 postgres प्रस्तावों UPSERT
साथ कार्यक्षमता INSERT
बयान।
मान लें कि आपके पास एक तालिका है, जिसे my_table कहा जाता है, जिसे पिछले कई उदाहरणों में बनाया गया है। हम एक पंक्ति सम्मिलित करते हैं, सम्मिलित पंक्ति का PK मान लौटाते हैं:
b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
id
----
2
(1 row)
INSERT 0 1
अब यदि हम मौजूदा अनूठी कुंजी के साथ पंक्ति सम्मिलित करने का प्रयास करते हैं तो यह एक अपवाद को बढ़ाएगा:
b=# INSERT INTO my_table values (2,'one',333);
ERROR: duplicate key value violates unique constraint "my_table_pkey"
DETAIL: Key (id)=(2) already exists.
अपग्रेड कार्यक्षमता किसी भी तरह इसे सम्मिलित करने की क्षमता प्रदान करती है, संघर्ष को हल करना:
b=# INSERT INTO my_table values (2,'one',333) ON CONFLICT (id) DO UPDATE SET name = my_table.name||' changed to: "two" at '||now() returning *;
id | name | contact_number
----+-----------------------------------------------------------------------------------------------------------+----------------
2 | one changed to: "two" at 2016-11-23 08:32:17.105179+00 | 333
(1 row)
INSERT 0 1