คำถามติดแท็ก postgresql

PostgreSQL ทุกรุ่น เพิ่มแท็กเฉพาะรุ่นเพิ่มเติมเช่น postgresql-11 หากบริบทนั้นสำคัญ

1
การรับหลาย ๆ คำสั่งด้วย“ แสดงระดับการแยกธุรกรรม” ใน pg_activity
ฉันใช้เซิร์ฟเวอร์ PostgreSQL สำหรับการใช้งานจริงของฉัน เมื่อฉันเริ่มต้นแบบสอบถาม select * from pg_stat_activity บนเซิร์ฟเวอร์ของฉันฉันได้รับ 98% ของข้อความค้นหาเช่น SHOW TRANSACTION ISOLATION LEVEL และเซิร์ฟเวอร์ของฉันยอมรับการเชื่อมต่อเพียง 100 ครั้งดังนั้นฉันจึงไม่สามารถดำเนินการต่อไปได้ ทำไมสิ่งนี้จึงเกิดขึ้น ฉันจะบล็อกข้อความค้นหาเหล่านี้ทั้งหมดได้อย่างไร

4
จะรักษาตัวนับที่ไม่ซ้ำกันต่อแถวด้วย PostgreSQL ได้อย่างไร
ฉันต้องการเก็บหมายเลขการแก้ไข (ต่อแถว) ที่ไม่ซ้ำกันในตาราง document_revisions ซึ่งหมายเลขการแก้ไขถูกกำหนดขอบเขตไว้ที่เอกสารดังนั้นจึงไม่ซ้ำกันกับทั้งตารางเฉพาะกับเอกสารที่เกี่ยวข้อง ตอนแรกฉันคิดเรื่อง: current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); แต่มีสภาพการแข่งขัน! ฉันพยายามที่จะแก้ปัญหาด้วยpg_advisory_lockแต่เอกสารนั้นค่อนข้างหายากและฉันก็ไม่เข้าใจอย่างเต็มที่และฉันไม่ต้องการล็อคบางอย่างโดยไม่ได้ตั้งใจ ต่อไปนี้เป็นที่ยอมรับหรือฉันทำผิดหรือมีวิธีแก้ปัญหาที่ดีกว่า SELECT pg_advisory_lock(123); current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); SELECT pg_advisory_unlock(123); ฉันไม่ควรล็อคแถวเอกสาร (key1) สำหรับการดำเนินการที่กำหนด (key2) แทนหรือไม่ …

1
วิธีปฏิบัติที่ดีที่สุดสำหรับการจัดเก็บข้อมูลเมตาของระเบียน
แนวปฏิบัติที่ดีที่สุดสำหรับการจัดเก็บข้อมูลเมตาของแต่ละระเบียนในฐานข้อมูลคืออะไร ฉันต้องการจัดเก็บข้อมูลเมตาทั่วไปเช่นเวลาสร้างและเวลาของการอัปเดตครั้งล่าสุดสำหรับตารางจำนวนมากในฐานข้อมูลของฉัน ฉันพบวิธีแก้ไขปัญหาต่าง ๆ : เก็บข้อมูลเมตาโดยตรงในตาราง ข้อดี: ข้อมูล Meta เชื่อมโยงโดยตรงกับบันทึก ไม่จำเป็นต้องใช้ตัวเชื่อมเพื่อดึงข้อมูลเมตา จุดด้อย: จำเป็นต้องใช้คอลัมน์ที่ซ้ำกันจำนวนมาก (เว้นแต่จะใช้การสืบทอด) ข้อมูล Meta และข้อมูลธุรกิจจะไม่แยกออกจากกัน สร้างตารางข้อมูลเมตาทั่วไปด้วยและใช้ซอฟต์คีย์ต่างประเทศเพื่อลิงค์ข้อมูลไปยังตารางและเรกคอร์ดที่ถูกต้อง ข้อดี: ไม่มีการทำซ้ำคอลัมน์ ข้อมูล Meta ถูกแยกออกจากข้อมูลธุรกิจ จุดด้อย: ไม่มีลิงก์โดยตรงระหว่างข้อมูลเมตาและข้อมูล (ไม่สามารถใช้ FK ได้) เข้าร่วมต้องมีเงื่อนไขเพิ่มเติม สร้างตารางข้อมูลเมตาแต่ละตารางสำหรับแต่ละตารางที่ต้องการข้อมูลเมตา ข้อดี: ข้อมูล Meta เชื่อมโยงโดยตรงกับบันทึก ข้อมูล Meta ถูกแยกออกจากข้อมูลธุรกิจ จุดด้อย: ต้องใช้ตารางเสริมจำนวนมาก จำเป็นต้องใช้คอลัมน์ที่ซ้ำกันจำนวนมาก (เว้นแต่จะใช้การสืบทอด) มีตัวเลือกข้อดีหรือข้อเสียมากกว่าตัวเลือกที่ฉันพูดถึงที่นี่หรือไม่? และวิธีปฏิบัติที่ดีที่สุดในการจัดเก็บข้อมูลเมตานี้คืออะไร

2
แปลงหน่วยของการวัด
กำลังมองหาการคำนวณหน่วยการวัดที่เหมาะสมที่สุดสำหรับรายการของสารที่ให้สารในปริมาณหน่วยที่แตกต่างกัน (แต่เข้ากันได้) ตารางการแปลงหน่วย ตารางแปลงหน่วยจัดเก็บหน่วยต่าง ๆ และความเกี่ยวข้องของหน่วยเหล่านั้น: id unit coefficient parent_id 36 "microlitre" 0.0000000010000000000000000 37 37 "millilitre" 0.0000010000000000000000000 5 5 "centilitre" 0.0000100000000000000000000 18 18 "decilitre" 0.0001000000000000000000000 34 34 "litre" 0.0010000000000000000000000 19 19 "dekalitre" 0.0100000000000000000000000 29 29 "hectolitre" 0.1000000000000000000000000 33 33 "kilolitre" 1.0000000000000000000000000 35 35 "megalitre" 1000.0000000000000000000000 0 การเรียงลำดับตามค่าสัมประสิทธิ์แสดงให้เห็นว่าการparent_idเชื่อมโยงหน่วยรองกับตัวเลขที่เหนือกว่า ตารางนี้สามารถสร้างได้ใน PostgreSQL โดยใช้: …

3
ความไม่สอดคล้องกันในการอ่านซ้ำ
http://www.postgresql.org/docs/9.2/static/transaction-iso.html โหมดการอ่านซ้ำจะให้การรับประกันอย่างเข้มงวดว่าแต่ละธุรกรรมจะเห็นมุมมองที่สมบูรณ์ของฐานข้อมูล อย่างไรก็ตามมุมมองนี้จะไม่จำเป็นต้องสอดคล้องกับการดำเนินการอนุกรม (ทีละครั้ง) เสมอของการทำธุรกรรมที่เกิดขึ้นพร้อมกันในระดับเดียวกัน ตัวอย่างเช่นแม้แต่ธุรกรรมแบบอ่านอย่างเดียวในระดับนี้อาจเห็นระเบียนควบคุมที่อัปเดตเพื่อแสดงว่าแบทช์เสร็จสมบูรณ์แล้ว แต่ไม่เห็นหนึ่งในบันทึกรายละเอียดซึ่งเป็นส่วนหนึ่งในเชิงตรรกะของแบทช์เพราะอ่านการแก้ไขเรคคอร์ดควบคุมก่อนหน้านี้ . ความพยายามในการบังคับใช้กฎเกณฑ์ทางธุรกิจโดยธุรกรรมที่ทำงานในระดับการแยกนี้ไม่น่าจะทำงานได้อย่างถูกต้องโดยไม่ต้องใช้การล็อคอย่างชัดเจนเพื่อป้องกันการทำธุรกรรมที่ขัดแย้งกัน นั่นไม่ใช่ phantom read ซึ่งเป็นไปไม่ได้ในโหมดอ่านซ้ำ เอกสารระบุว่าแบบสอบถามในธุรกรรมอ่านซ้ำสามารถดูสแน็ปช็อตเมื่อเริ่มต้นธุรกรรมจากนั้นจึงเป็นไปได้อย่างไรที่แบบสอบถามจะอ่านข้อมูลที่ไม่สอดคล้องกัน

2
Fillfactor สำหรับตารางแคชคืออะไร?
ฉันมีตารางที่มีการปรับปรุง / เข้าถึงมากซึ่งฉันเก็บวัตถุ Java ที่ทำให้เป็นอนุกรม พวกเขาอยู่ในตารางเป็นเวลา 2-3 ชั่วโมง (ยังมีการปรับปรุงในช่วงเวลานั้น) แล้วลบออก ขนาดของตารางประมาณ 300MB ฉันเคยเห็นว่ามันมาก VACUUMed บ่อยมากและสงสัยว่าการเปลี่ยนแปลงfillfactorจะช่วยได้อย่างไร

5
ผู้ใช้ PostgreSQL ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์หลังจากเปลี่ยนรหัสผ่าน
ฉันได้พบสิ่งนี้กับ 4 บทบาทที่ฉันสร้างขึ้น: หลังจากเปลี่ยนรหัสผ่านสำหรับผู้ใช้ใน pgAdmin III โดยใช้ GUI (1) ผู้ใช้นั้นไม่สามารถเข้าสู่ระบบได้อีก pgAdmin III แสดงข้อความข้อผิดพลาด: An error has occurred: Error connecting to the server: FATAL: password authentication failed for user "sam" FATAL: password authentication failed for user "sam" ระบบของฉัน: Postgresql 9.2 บน Ubuntu 12.04 มีวิธีแก้ไขปัญหานี้หรือไม่? (1): เข้าสู่ระบบด้วย postgres บัญชีผู้ใช้คลิกขวาในบทบาทเข้าสู่ระบบไปที่แท็บ 'ความหมาย' และป้อนรหัสผ่าน

3
เก็บสูตรไว้ในตารางและใช้สูตรในฟังก์ชัน
ฉันมีฐานข้อมูล PostgreSQL 9.1 ซึ่งเป็นส่วนหนึ่งที่จัดการค่าคอมมิชชั่นของตัวแทน ตัวแทนแต่ละรายมีสูตรการคำนวณของตนเองเพื่อรับค่าคอมมิชชั่น ฉันมีฟังก์ชั่นในการสร้างจำนวนค่าคอมมิชชันที่แต่ละตัวแทนควรได้รับ แต่มันเป็นไปไม่ได้ที่จะใช้เมื่อจำนวนตัวแทนเพิ่มขึ้น ฉันถูกบังคับให้ทำใบแจ้งยอดที่ยาวและรหัสซ้ำซึ่งทำให้ฟังก์ชั่นของฉันใหญ่มาก สูตรทั้งหมดมีตัวแปรคงที่: d .. วันทำงานในเดือนนั้น r .. โหนดใหม่ได้รับการรับรอง l .. คะแนนความภักดี s .. ค่านายหน้าย่อย b .. อัตราฐาน ฉัน .. รายได้ที่ได้รับ สูตรสามารถเป็นดังนี้: d*b+(l*4+r)+(i/d)+s แต่ละตัวแทนเจรจาสูตรการชำระเงินกับฝ่ายทรัพยากรบุคคล ดังนั้นฉันสามารถเก็บสูตรไว้ในตารางตัวแทนได้แล้วมีฟังก์ชั่นเล็ก ๆ ที่เพิ่งได้สูตรจากตารางและแปลมันด้วยค่าและคำนวณจำนวนหรือไม่

1
Seq Scan ที่ไม่คาดคิดเมื่อทำเคียวรีกับบูลีนที่มีค่า NULL
ฉันมีคอลัมน์ฐานข้อมูลที่เรียกว่าที่คอลัมน์ชนิดคือauto_review booleanมีดัชนีสำหรับฟิลด์นั้นซึ่งสร้างโดยใช้ ActiveRecord ORM CREATE INDEX index_table_on_auto_renew ON table USING btree (auto_renew); เมื่อฉันสอบถามฟิลด์สำหรับค่าบูลีน PG จะใช้ดัชนีตามที่คาดไว้ EXPLAIN for: SELECT "table".* FROM "table" WHERE "table"."auto_renew" = 'f' QUERY PLAN ---------------------------------------------------------------------------------------------- Bitmap Heap Scan on table (cost=51.65..826.50 rows=28039 width=186) Filter: (NOT auto_renew) -> Bitmap Index Scan on index_domains_on_auto_renew (cost=0.00..44.64 rows=2185 width=0) Index Cond: …

3
เปรียบเทียบราคาในสกุลเงินที่แตกต่างกันอย่างมีประสิทธิภาพ
ฉันต้องการให้ผู้ใช้สามารถค้นหาผลิตภัณฑ์ภายในช่วงราคาได้ ผู้ใช้ควรสามารถใช้สกุลเงินใดก็ได้ (USD, EUR, GBP, JPY, ... ) ไม่ว่าผลิตภัณฑ์จะมีการตั้งค่าสกุลเงินใดก็ตาม ดังนั้นราคาผลิตภัณฑ์คือ 200 ดอลล่าร์สหรัฐฯและหากผู้ใช้ค้นหาผลิตภัณฑ์ที่มีค่าใช้จ่าย 100EUR - 200EUR เขาก็อาจจะหาได้ จะทำให้มันเร็วและมีประสิทธิภาพได้อย่างไร? นี่คือสิ่งที่ฉันได้ทำมาจนถึงตอนนี้ ฉันเก็บprice, currency codeและcalculated_priceที่เป็นราคาในสกุลเงินยูโร (EUR) ที่เป็นสกุลเงินเริ่มต้น CREATE TABLE "products" ( "id" serial, "price" numeric NOT NULL, "currency" char(3), "calculated_price" numeric NOT NULL, CONSTRAINT "products_id_pkey" PRIMARY KEY ("id") ); CREATE TABLE "currencies" ( "id" …
10 postgresql  money 

4
วิธีหยุดสคริปต์ psql แบบมีเงื่อนไข (ขึ้นอยู่กับค่าตัวแปร)
ลองพิจารณาตัวอย่างต่อไปนี้ (ตั้งแต่เริ่มต้นของสคริปต์ psql): \c :db_to_run_on TRUNCATE the_most_important_table; -- tried to avoid similarities to anything that exists out there ตอนนี้ถ้ามันถูกเรียกใช้โดยคำสั่ง psql [connection details] -v db_to_run_on=\'dev_database\' จากนั้นมันจะทำงานและผู้ใช้มีความสุข แต่สิ่งที่ถ้า (s) เขาตัดสินใจที่จะระบุ-v db_to_run_on=production_database? (สมมติว่าสิ่งนี้สามารถเกิดขึ้นได้เช่นเดียวกับที่ผู้คนเรียกใช้rm -rf / # don't try this at home!!!บางครั้ง) หวังว่าจะมีการสำรองข้อมูลใหม่ของตารางนั้น ... ดังนั้นคำถามที่เกิดขึ้น: วิธีการตรวจสอบตัวแปรที่ส่งผ่านไปยังสคริปต์และหยุดการประมวลผลเพิ่มเติมตามค่าของพวกเขา
10 postgresql  psql 

4
วิธีตรวจสอบว่าแบบสอบถามย่อยมีผลลัพธ์ที่แตกต่างกันหนึ่งรายการอย่างแน่นอนหรือไม่และค่าที่ระบุไว้รัดกุม?
ฉันพบว่าตัวเองเขียนข้อความต่อไปนี้: select 'yes' where exists(select * from foo where val=1) and not exists(select * from foo where val<>1); และสงสัยว่ามีวิธีรัดกุมมากกว่านี้หรือไม่โดยไม่ต้องเสียสละความสามารถในการอ่านมากเกินไป ฉันพบวิธีหนึ่งที่ฉันโพสต์เป็นคำตอบ แต่ฉันไม่พอใจกับมันโดยสิ้นเชิงและจะสนใจทางเลือกอื่น ๆ ในกรณีนี้valจะไม่ซ้ำกันภายในfoo- ไม่มีการซ้ำซ้อน

1
PostgreSQL ข้อความประเภทข้อมูล vs varchar โดยไม่มีความยาว
ใน PostgreSQL คุณสามารถสร้างคอลัมน์ที่มีอักขระชนิดข้อมูลเปลี่ยนแปลง (โดยไม่มีความแม่นยำความยาว) หรือข้อความเช่นนี้: ALTER TABLE test ADD COLUMN c1 varchar; ALTER TABLE test ADD COLUMN c2 text; มีความแตกต่างระหว่างชนิดข้อมูลสองชนิดนี้หรือไม่ เอกสารไม่ชัดเจนเกี่ยวกับเรื่องนี้ พวกเขาพูดว่า: หากใช้การเปลี่ยนแปลงอักขระโดยไม่มีตัวระบุความยาวชนิดจะยอมรับสตริงที่มีขนาดใดก็ได้ [ ... ] นอกจากนี้ PostgreSQL ยังมีประเภทข้อความซึ่งจัดเก็บสตริงที่มีความยาวเท่าใดก็ได้ ดูเหมือนว่าทั้งสองประเภทข้อมูลจะเทียบเท่า แต่ไม่ชัดเจน ... ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้? ขอบคุณนิโก้

2
ฉันสามารถมีตารางหนึ่งเป็น "นามแฝง" หรือ "symlink" ไปยังตารางอื่นได้หรือไม่
ฉันมีสองตารางที่มีโครงสร้างเดียวกัน A และ B มีการเขียนแอปพลิเคชันบางอย่างเพื่อให้มันเขียนข้อมูลเดียวกันไปยังตารางทั้งสองเสมอ หลังจากการสนทนากับเพื่อนร่วมงานเกี่ยวกับศักยภาพในการประหยัดพื้นที่ไดรฟ์ฉันสงสัยว่า mysql หรือ postgresql มีความสามารถในการสร้างบนโต๊ะเป็น "นามแฝง" หรือ "symlink" ของอีกคน ฉันต้องการให้พฤติกรรมคล้ายกับ symlink ของไฟล์อ่อน โดยที่การอ่านจาก symlink เองหรือเป้าหมายจะให้ผลลัพธ์เดียวกันและการเขียนไปที่ทั้งสองจะเป็นการอัพเดตเป้าหมาย
10 mysql  postgresql 

2
PostgreSQL สามารถสร้างฐานข้อมูลได้หรือไม่
ฉันกำลังย้ายโค้ดจาก Sybase ไปยัง PostgreSQL บางเวอร์ชัน นี่เป็นแอปพลิเคชั่น C ที่ใช้ไลบรารีไคลเอ็นต์ Sybase แนวทางของฉันคือการเขียนเลเยอร์การแปลที่แปลการโทรไปdbsqlexec()ที่PQexec()(ตัวอย่าง) ส่วนนั้นทำงานได้เป็นส่วนใหญ่ ปรากฏว่ามีการตั้งค่าฐานข้อมูล Sybase ในลักษณะที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เกี่ยวกับชื่อวัตถุฐานข้อมูล) ตัวอย่างเช่นมีทั้งWIDGETตารางและwidgetตาราง ดูเหมือนว่าการประชุมในแอพพลิเคชั่นนี้นั้นชื่อ all-uppercase จะระบุตารางข้อมูลจริงในขณะที่ชื่อตัวพิมพ์เล็กจะถูกใช้เป็นตารางชั่วคราวเมื่อทำการประมวลผล ตามโครงสร้างคำศัพท์ 4.1 " คำสำคัญและตัวระบุที่ไม่มีเครื่องหมายเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่" ฉันรู้ว่าฉันสามารถอ้างตัวระบุสองครั้งเพื่อปิดการใช้งานการพับอัตโนมัติเป็นตัวพิมพ์เล็ก แต่ฉันไม่ต้องการทำด้วยตนเอง ของรหัสที่ใช้ฐานข้อมูลนี้ มีวิธีการตั้งค่า PostgreSQL เพื่อปิดใช้งานตัวพิมพ์เล็กอัตโนมัตินี้สำหรับตัวระบุวัตถุฐานข้อมูลหรือไม่? ทางเลือกของฉันคือการเขียนโค้ดที่ตรวจสอบคำสั่ง SQL แต่ละคำสั่งและใส่เครื่องหมายอัญประกาศคู่รอบตัวระบุทุกตัว (นั่นไม่ใช่คำหลัก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.