2014-12-04 57 views
2

我定義了一個BEFORE INSERT觸發器表和它的作品如預期的單INSERT報表上的每一行解僱,但不是INSERT ... SELECT也不MERGE語句。爲什麼不觸發當使用「插入選擇」或「合併」

這些是我的數據庫對象(簡體):

CREATE TABLE "COMPANY" (
    "ID" NUMBER NOT NULL, 
    "NAME" VARCHAR(100) 
); 

CREATE TABLE "EMPLOYEE" (
    "ID" NUMBER NOT NULL, 
    "COMPANY_ID" NUMBER NOT NULL 
); 

CREATE UNIQUE INDEX "EMPLOYEE_PK" ON "EMPLOYEE" ("ID"); 

CREATE SEQUENCE "EMPLOYEE_SEQUENCE"; 

CREATE TRIGGER "BI_EMPLOYEE" BEFORE INSERT ON "EMPLOYEE" 
    REFERENCING NEW AS newrow FOR EACH ROW BEGIN ATOMIC 
    IF newrow.id IS NULL THEN 
     SET newrow.id = NEXT VALUE FOR employee_sequence; 
    END IF; 
END; 

如果單INSERT語句執行,一切正常,該ÌD是從序列中取出。但是,如果我執行比如

INSERT INTO employee (company_id) SELECT id FROM company; 

的東西,我得到一個錯誤:

integrity constraint violation: unique constraint or index violation: "EMPLOYEE_PK" 

這可能propably意味着它試圖插入從序列相同的鍵兩次。

我正在使用HSQLDB的最新版本2.3.2。

+1

你知道,你可以定義你的'employee.id'列'默認爲identity'這將徹底去除需要觸發產生。 – 2014-12-04 16:16:34

+0

@a_horse_with_no_name是的,但不幸的是我不得不反映一個oracle數據庫的結構(這是單元測試)。所以我必須使用一個序列。 – Zeemee 2014-12-05 06:51:40

+0

使用不同的DBMS進行單元測試是錯誤的。這只是DBMS之間許多差異的一個例子(有時顯而易見,有時非常微妙)。針對不同DBMS運行的單元測試並不是真正有效的測試。 – 2014-12-05 06:55:16

回答

0

因爲觸發器是基於設置而非基於行的。

查看詳情here

+0

對於SQL Server而言,這可能是正確的,但對於HSQLDB不是這樣。在HSQLDB中(與許多其他DBMS一樣),您可以在行級觸發器和語句級觸發器之間進行選擇。如果您查看示例,則可以使用「FOR EACH ROW」明確創建觸發器。 – 2014-12-05 06:53:27

+0

@Kenan在HSQLDB中有這個「FOR EACH ROW」......所以我不認爲這是正確的。 – Zeemee 2014-12-05 06:57:50

相關問題