2012-01-16 44 views
1

我正在制定課程時間表。有5班,每班每週發生一次。我有兩張桌子,一張班表和一張時間表。觸發器在類mysql時間表中複製同一表中的行

我試圖做一個觸發器,該行將在同一張表上覆制,但在不同的日期輸入。插入後我還需要刪除該行。

我有這個至今:

DROP TRIGGER IF EXISTS `erase`// 
CREATE TRIGGER `erase` BEFORE DELETE ON `flsch` 
FOR EACH ROW INSERT INTO flsch SELECT * FROM flsch WHERE DATE_ID=old.DATE_ID 

請問有什麼辦法可以做到這一點?

@Devart我已經添加了新的代碼的要求如下:

DELIMITER $$ 

CREATE PROCEDURE add_f(IN param_DATEID TIMESTAMP, IN param_SNO VARCHAR(6), IN param_sub VARCHAR(20), IN param_SCHD INT(4)) 


BEGIN 
IF SNO ='math01' 
INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD); 
INSERT INTO schtt VALUES(param_DATEID + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD); 
END IF; 

ELSE IF SNO='eng101' 

INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD); 
INSERT INTO schtt VALUES((param_DATEID + INTERVAL 1 DAY) + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD); 
END IF; 
END 

$$ 

DELIMITER ; 

我可以輸入一個字符串在特定日期與程序後,將刪除一條記錄,或者可以只完成通過觸發器

回答

2

由於限制的原因,不能通過觸發器完成 - 在存儲的函數或觸發器中,不允許修改已被語句使用(用於讀取或寫入)的表調用函數或觸發器。

編寫存儲過程來執行邏輯或在應用程序中執行它。


OK,假設我們有一個表,我們需要添加一條記錄和複製的記錄與不同的日期,存儲過程可以幫助我們:

CREATE TABLE table1 (
    name VARCHAR(255) DEFAULT NULL, 
    dt DATE DEFAULT NULL 
); 

DELIMITER $$ 

CREATE PROCEDURE add_two_records(IN param_name VARCHAR(255), IN param_dt DATE) 
BEGIN 
    INSERT INTO table1 VALUES(param_name, param_dt); 
    INSERT INTO table1 VALUES(param_name, param_dt + INTERVAL 1 DAY); 
END 
$$ 

DELIMITER ; 

添加記錄:

CALL add_two_records('Rick', '2012-01-16'); 

讓我們來看看結果:

SELECT * FROM table1; 
+------+------------+ 
| name | dt   | 
+------+------------+ 
| Rick | 2012-01-16 | 
| Rick | 2012-01-17 | 
+------+------------+ 

語法錯誤修正:

DELIMITER $$ 

CREATE PROCEDURE add_f(IN param_DATEID TIMESTAMP, IN param_SNO VARCHAR(6), IN param_sub VARCHAR(20), IN param_SCHD INT(4)) 
BEGIN 
IF param_SNO ='math01' THEN 
    INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD); 
    INSERT INTO schtt VALUES(param_DATEID + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD); 
ELSE IF param_SNO='eng101' THEN 
    INSERT INTO schtt VALUES(param_DATEID, param_SNO, param_SUB, param_SCHD); 
    INSERT INTO schtt VALUES((param_DATEID + INTERVAL 1 DAY) + INTERVAL 7 DAY, param_SNO, param_SUB, param_SCHD); 

    -- You can use this one - 
    -- INSERT INTO schtt VALUES(param_DATEID + INTERVAL 8 DAY, param_SNO, param_SUB, param_SCHD); 
END IF; 

END$$ 

DELIMITER ; 

你問:

我可以輸入一個字符串在特定日期與程序後,將刪除記錄...

是的,你可以用DELETE語句+ WHERE子句來做到這一點。

+0

我對MySQL很陌生。你能解釋,更深入的..謝謝:) – lovinxlost

+0

我添加了一個例子。 – Devart

+0

謝謝@Devart這真的很有幫助,謝謝你的解釋。 我只是在設置subject_ID時遇到了一些麻煩。 我希望程序插入記錄到日程表中,其中subject_id ='math01'..但是當我這樣做'代碼'時它的語法錯誤gibing INSERT INTO schtt VALUES WHERE subject_id ='BG0002'(DATE_ID + INTERVAL 1 DAY,subject_id,teacher,sched_TIME); 'code' 此外,如果我在程序中選擇'從schtt'代碼'code',我將能夠讀取當前表信息並複製到新記錄中。 – lovinxlost

相關問題