トリガーの一部として日付を更新しますか?

私はPHPインターネットアプリケーションに現在のコンテンツとアーカイブされたコンテンツのリストを保存しようとしています。私は、アーカイブされているものとして、終了日を持つものとアーカイブされていないものを、終了日がないものとして識別できるようにしたい。より多くの道を作ることができれば理想的ですが、ここから始めたいと思っています。

私が気付いている最初のことは、 "on line 1"で構文エラーが出ているが、テーブルを作成する際に二重引用符がないということです.2番目の問題は 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";
1

1 答え

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");
2
追加された
ダブルクォート( ")ではありません。ダブルアポストロフィ(" )です。私の悪い - 私は何とかそこにセミコロンを持っています。私の(編集された)投稿から修正されたバージョンをコピーすることができます上の
追加された 著者 Bohemian,
私はあなたを信じていますが、私はまだエラーが発生しています: CREATE TABLE planIDxlevelID(planID INT NOT NULL REFERENCES plan(id)、levelID INT NOT NULL REFERENCESレベル(id)、arXORcur ENUM( 'アーカイブ'、 '現在') ; エラーは "近いですが、二重引用符はありません。
追加された 著者 Wolfpack'08,
ああ。甘い。うん、それは私が何をしたのか正確には分かりませんが、それは大きな改善です。他の誰かが私を連れて来たよりもずっと多くのことです。ですから、ボヘミアンの助けをありがとう。
追加された 著者 Wolfpack'08,
insert ステートメントで#1442エラーが発生しましたが、 planIDxlevelID テーブルの NOT NULL テーブルが競合している可能性があると考えていましたトリガが planID NULL を追加しようとしましたが、 "unknown"を "unk"に変更しました。同じエラー。
追加された 著者 Wolfpack'08,