PostgreSQL 與其他關聯式資料庫系統一樣,允許資料庫表之間存在複雜的關係。 一個常見的場景是多對多關係,其中一個表中的多個記錄可以與另一個表中的多個記錄相關聯。
在 PostgreSQL 中實作多對多關係通常需要第三個中間表。這個「連接表」或「橋接表」連接兩個原始表。 它包含引用兩個表的主鍵的外鍵,形成複合主鍵(或唯一約束)。
我們舉個例子來說明:
<code class="language-sql">CREATE TABLE product ( product_id SERIAL PRIMARY KEY, product_name TEXT NOT NULL, price NUMERIC NOT NULL DEFAULT 0 ); CREATE TABLE invoice ( invoice_id SERIAL PRIMARY KEY, invoice_number TEXT NOT NULL, invoice_date DATE NOT NULL DEFAULT CURRENT_DATE ); CREATE TABLE invoice_product ( invoice_id INTEGER REFERENCES invoice (invoice_id) ON UPDATE CASCADE ON DELETE CASCADE, product_id INTEGER REFERENCES product (product_id) ON UPDATE CASCADE, quantity NUMERIC NOT NULL DEFAULT 1, CONSTRAINT invoice_product_pkey PRIMARY KEY (invoice_id, product_id) );</code>
invoice_product
表格充當連接表,連結 invoice
和 product
。 invoice_id
和 product_id
是外鍵,確保引用完整性。 ON UPDATE CASCADE
和 ON DELETE CASCADE
子句在主表中修改或刪除記錄時保持資料一致性。
在invoice
或product
表中插入或刪除行時,外鍵上的級聯操作會自動更新或刪除invoice_product
表中的相關條目,從而簡化資料管理。
要跨此多對多關係查詢數據,請使用 JOIN
操作。 例如,要尋找與特定發票關聯的所有產品:
<code class="language-sql">SELECT p.product_name, ip.quantity FROM invoice i JOIN invoice_product ip ON i.invoice_id = ip.invoice_id JOIN product p ON ip.product_id = p.product_id WHERE i.invoice_id = 123;</code>
總之,在 PostgreSQL 中有效管理多對多關係涉及建立具有適當外鍵約束的聯結表。這種方法有利於清晰的資料建模和高效的資料檢索。
以上是如何在 PostgreSQL 中實現多對多關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!