我正在尝试在PHP Internet应用程序中保留当前内容和存档内容的列表。我希望能够识别归档为具有enddate的内容,以及未归档为没有enddate的内容。如果我可以创建更多路径,那将是理想的,但我希望从这里开始。
我注意到的第一件事是我在第1行遇到了语法错误,但是在我创建表时没有双引号。我遇到的第二个问题是使用{ {1}}作为数据类型。我尝试使用TIMESTAMP
作为startdate,并且它返回了语法错误。我遇到的最后一个问题是触发器构造。我无法达到足够远的程度排除故障。一旦我通过参考文献,我也会尝试解决这个问题。
CURRENT_TIMESTAMP
答案 0 :(得分:2)
TIMESTAMP
vs DATETIME
这是一个经典的问题:TIMESTAMP
是特殊的数据类型
每次触摸行时都会使用“now”更新,无论是将其更新为其他值还是不管它。你想要的是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");