2012-05-07 26 views
0

問:

什麼是選擇列值轉換成UPDATE/INSERT觸發NEW變量時使用正確的語法?複製單個值

詳情:

這裏是[簡化]表我使用以及查詢。爲了這個例子的目的,我選擇了一些遞歸的東西,在這種情況下是一個評論(即,一個人可以評論一張圖片,但也可以評論)。在任何時候,我都想知道評論是在評論什麼圖片,但我不希望查詢表格n次以得到該圖片(因此我拒絕Adjacency List Model),所以我在插入時觸發了一個觸發器複製目標圖片。

PICTURES表:

CREATE TABLE IF NOT EXISTS pictures 
(
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (id) 
) 

comments表:

CREATE TABLE IF NOT EXISTS comments 
(
    id INT NOT NULL AUTO_INCREMENT, 
    picture_id INT NOT NULL, 
    comment_id INT NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY (picture_id) REFERENCES pictures (id), 
    FOREIGN KEY (comment_id) REFERENCES comments (id) 
) 

評論觸發:注意NEW.comment_idNEW.picture_idNOT NULL,因此,他們默認爲零(FALSE) 。在我的實際程序中,我有一個XOR拒絕分配圖片和評論ID的無效嘗試。

CREATE TRIGGER bi_comments_fer BEFORE INSERT ON comments FOR EACH ROW 
BEGIN 
    IF (NEW.comment_id) 
    THEN 
     select NEW.picture_id := picture_id from comments where id = NEW.comment_id; 
    END IF; 
END 

我想包括@標誌,像這樣

select @NEW.picture_id := picture_id from comments where id = NEW.comment_id; 

但是,這也提出了一個語法錯誤。誰能告訴我如何解決這個問題?

回答

2
SET NEW.picture_id := (SELECT picture_id FROM comments WHERE id = NEW.commend_id); 
+0

只是出於好奇,如果'SELECT'返回多個值(即''id'不是'UNIQUE')會發生什麼?宇宙會崩潰嗎? – puk

+0

@puk:你會得到一個錯誤,它不是指望有多個值,而是不能逐字記住我的頭頂。 – eggyal