我需要一種方法來進行檢查(如果用戶在過去 6 個月內去過同一個地方,則不允許發生輸入)這是我的架構:
CREATE SCHEMA code
CREATE TABLE code.place (
pk_place_id VARCHAR(8),
place_name VARCHAR (50),
CONSTRAINT pk_place_id PRIMARY KEY (pk_place_id)
);
CREATE TABLE code.user (
pk_user_id VARCHAR(3),
user_name VARCHAR (50),
CONSTRAINT pk_user_id PRIMARY KEY (pk_user_id)
);
CREATE TABLE code.visit (
pk_user_id VARCHAR(3),
pk_place_id VARCHAR(8),
data DATE,
CONSTRAINT pk_user_id FOREIGN KEY (pk_user_id) REFERENCES code.user,
CONSTRAINT pk_place_id FOREIGN KEY (pk_place_id) REFERENCES code.place
);
我有代碼來顯示一個表格,其中只有過去 6 個月內沒有去過某個地方的用戶才會出現在表格中。但我需要把它作為我的訪問表中的檢查,所以沒有員工會將這些資訊放在訪問表中,但我發現自己沒有能力這樣做。
SELECT pk_place_id, pk_user_id, date
FROM visita_polo
WHERE EXTRACT(year FROM age(NOW(),data))*12 EXTRACT(month FROM age(now(),data)) > 6;
uj5u.com熱心網友回復:
首先,添加btree_gist擴展名。
CREATE EXTENSION btree_gist;
然后使用以下排除項創建您的表。
CREATE TABLE code.visit (
pk_user_id VARCHAR(3)
, pk_place_id VARCHAR(8)
, data DATE
, CONSTRAINT pk_user_id FOREIGN KEY (pk_user_id) REFERENCES code.user
, CONSTRAINT pk_place_id FOREIGN KEY (pk_place_id) REFERENCES code.place
, EXCLUDE USING gist (pk_user_id WITH =, pk_place_id WITH =, daterange(data, (data interval '6 months')::date) WITH &&)
);
現在讓我們輸入一些資料。
INSERT INTO code.user
VALUES ('ABC', 'Albert Brian Cohen')
;
INSERT INTO code.place
VALUES ('MADRID', 'Madrid, Spain')
;
INSERT INTO code.visit
VALUES ('ABC', 'MADRID', CURRENT_DATE)
;
到目前為止,一切都很好。
INSERT INTO code.visit
VALUES ('ABC', 'MADRID', CURRENT_DATE interval '5 months')
;
回傳排除約束違反錯誤。哎呀!沒有足夠的時間過去。
INSERT INTO code.visit
VALUES ('ABC', 'MADRID', CURRENT_DATE interval '6 months')
;
按預期插入。都好!
資料庫將為您執行此操作。無需在應用層嘗試并強制執行此操作,尤其是因為應用層會受到競爭條件的影響。最好在資料層處理這個問題,這樣即使應用程式錯誤也不會默默地破壞您的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/521713.html
標籤:PostgreSQL
