2011-12-19 26 views
1

我試圖在我的PHP Internet應用程序中保留當前內容和歸檔內容的列表。我希望能夠識別歸檔爲具有enddate的內容,以及未歸檔爲沒有enddate的內容。如果我可以創造更多路徑,這將是理想的,但我希望從這裏開始。將日期更新爲觸發器的一部分?

我注意到的第一件事是,我在「在線1上得到語法錯誤,但是在創建表時沒有雙引號。我遇到的第二個問題是使用TIMESTAMP作爲一個數據類型,我嘗試使用CURRENT_TIMESTAMP作爲開始日期,並且它返回了語法錯誤,我遇到的最後一個問題是觸發器的構造,我無法解決它的問題,只要我讓過去的文獻,我也將盡力排查。

CREATE TABLE plan(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(32), 
    startdate TIMESTAMP NOT NULL, 
    enddate TIMESTAMP); 
CREATE TABLE level(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(32), 
    description VARCHAR(500), 
    startdate TIMESTAMP NOT NULL, 
    enddate TIMESTAMP); 
CREATE TABLE planIDxlevelID(
    planID INT NOT NULL REFERENCES plan(id), 
    levelID INT NOT NULL REFERENCES level(id), 
    arXORcur ENUM('archive', 'current'); 
); 

delimiter | 

CREATE TRIGGER testref BEFORE INSERT ON plan 
    FOR EACH ROW BEGIN 
    INSERT INTO plan(id, plan, startdate, enddate) 
     SET id = LAST_INSERT_ID(id + 1), name = NEW.name, startdate = NEW.UTC_TIMESTAMP, enddate = NULL; 
    UPDATE plan(enddate) WHERE plan.id = OLD.id 
     SET enddate = UTC_TIMESTAMP; 
    INSERT INTO planIDxlevelID(planID, levelID, arXORcur) 
     SET planID = NEW.planID, levelID = OLD.levelID, arXORcur = current; 
    UPDATE planIDxlevelID(planID, levelID, arXORcur) WHERE planID = OLD.planID 
     SET planID = OLD.planID, levelID = OLD.levelID, arXORcur = archive; 
    END; 
| 

delimiter ; 

INSERT INTO plan (name) VALUES 
    "Frogs", "Toys", "Trucks", "Nature", "Seasons", 
    "Construction", "Candy", "Rainbows", "Telephone", "Breakfasts"; 

回答

2

TIMESTAMP VS DATETIME

這是一個典型的疑難雜症:TIMESTAMP特殊數據類型,它 更新爲「現在」每行被觸摸,你是否更新到另一個值或息事寧人時間。你想要的是DATETIME

接下來,您有許多語法和其他錯誤。沒有錯誤下面執行,但是它可能不是現在有你想要的邏輯,但可以對其進行編輯,以解決這個問題:

CREATE TABLE plan (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(32), 
    startdate DATETIME NOT NULL, -- changed TIMESTAMP to DATETIME 
    enddate DATETIME -- changed TIMESTAMP to DATETIME 
); 

CREATE TABLE level (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(32), 
    description VARCHAR(500), 
    startdate DATETIME NOT NULL, -- changed TIMESTAMP to DATETIME 
    enddate DATETIME -- changed TIMESTAMP to DATETIME 
); 

CREATE TABLE planIDxlevelID (
    planID INT NOT NULL REFERENCES plan(id), 
    levelID INT NOT NULL REFERENCES level(id), 
    arXORcur ENUM('archive', 'current') 
); 

DROP TRIGGER IF EXISTS test_insert; 
delimiter | 
CREATE TRIGGER test_insert BEFORE INSERT ON plan 
    FOR EACH ROW BEGIN 
    INSERT INTO plan (id, plan, startdate) 
    values (LAST_INSERT_ID() + 1, NEW.name, NEW.UTC_TIMESTAMP()); 

    INSERT INTO planIDxlevelID (planID, levelID, arXORcur) 
    values (NEW.ID, null, arXORcur = current);  
    END;| 
delimiter ; 

DROP TRIGGER IF EXISTS test_update; 
delimiter | 
CREATE TRIGGER test_update BEFORE UPDATE ON plan 
    FOR EACH ROW BEGIN 
    UPDATE plan SET 
    enddate = UTC_TIMESTAMP 
    WHERE plan.id = OLD.id; 

    UPDATE planIDxlevelID SET 
    planID = NEW.ID, 
    levelID = null, 
    arXORcur = archive 
    WHERE planID = OLD.ID; 
    END;| 
delimiter ; 

INSERT INTO plan (name) VALUES 
    ("Frogs"), ("Toys"), ("Trucks"), ("Nature"), ("Seasons"), 
    ("Construction"), ("Candy"), ("Rainbows"), ("Telephone"), ("Breakfasts"); 
+0

我相信你,但我仍然在這裏得到一個錯誤:'CREATE TABLE planIDxlevelID( planID INT NOT NULL REFERENCES plan(id), levelID INT NOT NULL REFERENCES level(id), arXORcur ENUM('archive','current');'它表示錯誤接近「,但沒有雙引號。奇怪的是,對嗎? – 2011-12-19 09:10:37

+1

它不是雙引號('''),它是一個雙撇號('''')。你錯過了右括號。它應該看起來像...... arXORcur ENUM('archive' ,'current'));'(結束時注意雙括號)。我的壞 - 我不知何故在那裏得到了一個分號。你可以從我的(編輯)帖子上面複製修正版本 – Bohemian 2011-12-19 11:09:22

+0

哦。甜。是的,這不完全是我以前的事,但這是一個巨大的進步。這比其他任何人帶給我的還要多。所以,非常感謝幫助,波希米亞人。 – 2011-12-19 11:13:04