2012-04-18 54 views
1

我有6張桌子:在SQL中創建查詢需要一些幫助?

Staff (StaffID, Name) 
Product (ProductID, Name) 
Faq (FaqID, Question, Answer, ProductID*) 
Customer (CustomerID, Name, Email) 
Ticket (TicketID, Problem, Status, Priority, LoggedTime, CustomerID* , ProductID*) 
TicketUpdate (TicketUpdateID, Message, UpdateTime, TicketID* , StaffID*) 

要回答的問題: 給定的產品ID,刪除的記錄該產品。當產品被移除時,所有相關的常見問題解答可以保留在數據庫中,但ProductID字段中應該有一個空引用。但是,產品的刪除也應該刪除任何關聯的故障單及其更新。爲了完整性,已刪除的故障單及其更新應複製到審計表或一組表中,以維護產品,其故障單和更新的歷史數據。 (提示:您需要定義一個或多個表來維護此審覈信息,並在產品被刪除時自動複製任何已刪除的故障單和故障單更新)。您的審覈表應記錄請求刪除的用戶和刪除操作的時間戳。

我已經創造了額外的maintain_audit表:

CREATE TABLE maintain_audit(
TicketID INTEGER NOT NULL, 
TicketUpdateID INTEGER NOT NULL, 
Message VARCHAR(1000), 
mdate TIMESTAMP NOT NULL, 
muser VARCHAR(128), 
PRIMARY KEY (TicketID, TicketUpdateID) 
); 

Addittionally我已創建1個功能和觸發:

CREATE OR REPLACE FUNCTION maintain_audit() 
     RETURNS TRIGGER AS $BODY$ 
     BEGIN 
     INSERT INTO maintain_audit (TicketID,TicketUpdateID,Message,muser,mdate) 
    (SELECT Ticket.ID,TicketUpdate.ID,Message,user,now() FROM Ticket, TicketUpdate WHERE    Ticket.ID=TicketUpdate.TicketID AND Ticket.ProductID = OLD.ID); 
     RETURN OLD; 
     END; 
    $BODY$ 
     LANGUAGE plpgsql; 


CREATE TRIGGER maintain_audit 
    BEFORE DELETE 
    ON Product 
    FOR EACH ROW 
    EXECUTE PROCEDURE maintain_audit() 

    DELETE FROM Product WHERE Product.ID=30; 

當我運行此我得到這樣的:

ERROR: null value in column "productid" violates not-null constraint 
    CONTEXT: SQL statement "UPDATE ONLY "public"."faq" SET "productid" = NULL WHERE $1  OPERATOR(pg_catalog.=) "productid"" 

GUYS,你能幫我解決這個問題嗎?

回答

2

你可能想要的是觸發器。不確定你正在使用什麼RDBMS,但這是你應該開始的地方。我從零開始,在一個小時內觸發並運行在一個類似的情況。

如果您還不知道,觸發器會在某個表上發生特定類型的查詢(如插入,更新或刪除)後執行某些操作。你可以做任何類型的查詢。

我會給你的另一個提示是不要刪除任何東西,因爲那樣會破壞數據的完整性。你可以添加一個「active」布爾型字段,將active設置爲false,然後在大多數系統查詢中進行篩選。或者,您可以將關聯的記錄移出到具有相同結構的Products_archive表。容易做到:

select * into destination from source where 1=0 

不過,我會做你需要使用觸發器的工作,因爲它們是如此自動的。

+0

感謝賈斯汀!;-)這是非常有幫助! – BlackOctober 2012-04-18 23:05:00

1
  1. 爲Ticket.product_id和TicketUpdate.Ticket_id創建了一個具有ON DELETE CASCADE的外鍵。這會在您刪除產品時自動刪除所有票證和ticketupdates。

  2. 使用product_id,user和timestamp爲產品刪除者創建審計表。 ticketUpdate的審計表應該準確地鏡像它們。

  3. 爲表單票證創建一個BEFORE DELETE TRIGGER,它將票證複製到審計表中。

  4. 執行相同的TicketUpdate

  5. 創建DETETE觸發產品後拍照誰請求的產品在產品審覈表中刪除。

  6. 在表FAQ創建PRODUCT_ID與外鍵的DELETE SET NULL

+0

非常感謝David!;-)這非常有幫助! – BlackOctober 2012-04-18 23:04:33