如何创建一个SQLite触发器,根据另一个条目更新条目?

时间:2017-05-14 00:17:17

标签: sql sqlite

我有一列文件夹名称,我有一个部分目录地址。当我添加或更改文件夹名称时 - 我希望附加目录地址...

所以......当我更新文件夹名称时,触发器应该只是自动将文件夹名称添加到目录的末尾。但是,虽然我在MySQL中的工作相似 - 出于某种原因,我无法让SQLite工作

`CREATE TRIGGER df_match_a AFTER UPDATE ON user_cats
BEGIN
SET NEW.save_directory = CONCAT(OLD.save_directory,NEW.folder)
END;`

我得到了:

near "SET": syntax error: 

这是一个可以实现我想要的MySQL代码... 它会自动更新API_Call>>当我将新信息添加到用户名 - 和Playlist_ID

CREATE DEFINER=`root`@`localhost` TRIGGER `api_links` BEFORE INSERT ON `spotify follow lists` FOR EACH ROW BEGIN
    SET NEW.`API Call` = CONCAT("https://api.spotify.com/v1/users/",NEW.`Username`,"/playlists/",NEW.`Playlist ID);
END

这就是数据库转储的样子......

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "user_cats" (
    `category`  TEXT,
    `uploader`  TEXT,
    `folder`    TEXT,
    `playlists` TEXT,
    `playlist_image`    TEXT,
    `save_directory`    TEXT
);
INSERT INTO user_cats VALUES('Comics','ComicsExplained','DC Rebirth','[''New to DC Comics? Start here!'']',NULL,'%USERPROFILE%\Videos\Online Videos\Comics\ComicsExplained\');
INSERT INTO user_cats VALUES('Comics','Comicstorian',NULL,NULL,NULL,NULL);
INSERT INTO user_cats VALUES('Video Games','IGN','Daily Fix','[''Daily Fix'']',NULL,'%USERPROFILE%\Videos\Online Videos\Video Games\IGN\Daily Fix\');
INSERT INTO user_cats VALUES('Comics','Marvel Entertainment','Marvel Top 10','[''Marvel Top 10'']',NULL,'%USERPROFILE%\Videos\Online Videos\Comics\Marvel Entertainment\');
INSERT INTO user_cats VALUES('','ScrewAttack!',NULL,NULL,NULL,NULL);
COMMIT;

2 个答案:

答案 0 :(得分:0)

我认为它类似

CREATE TRIGGER df_match_a AFTER UPDATE ON user_cats BEGIN UPDATE user_cats SET NEW.save_directory = CONCAT(OLD.save_directory,NEW.folder) END;

答案 1 :(得分:0)

感谢您的帮助;我终于明白了! 以下是详细信息......

因此,MySQL执行和SQLite之间存在一些差异......

  1. MySQL使用CONCAT(),但SQLite使用||
  2. 所以...这...

    SET NEW.save_directory = CONCAT(OLD.save_directory,NEW.folder)

    ...成了

    SET NEW.save_directory = (OLD.save_directory || NEW.folder)

    1. 我不需要添加新内容。声明
    2. SET NEW.save_directory = (OLD.save_directory || NEW.folder)

      是语法错误,但是......

      SET save_directory = (OLD.save_directory || NEW.folder)

      作品

      1. 触发器语句的结尾需要分号。
      2. SET save_directory = (OLD.save_directory || NEW.folder) END;

        但是,我应该在New.folder)

        之后加一个分号
        `SET save_directory = (OLD.save_directory || NEW.folder);
        END;`
        
        1. 我需要WHERE选项才能使用新的save_directory名称
        2. 更新folder

          有了......

          SET save_directory = (OLD.save_directory || NEW.folder); END;

          一个folder名称的更改将更改所有 save_directory

          但是,添加WHERE选项可确保只更新NEW.folder名称的行。

          SET save_directory = (OLD.save_directory || NEW.folder) WHERE folder = NEW.folder; END

          最后......

          1. 声明本身需要更改......
          2. 使用...

            SET save_directory = (OLD.save_directory || "\" || NEW.folder) WHERE folder = NEW.folder;
            END
            

            我的旧save_directory每次都会附加新的。 例如,我开始......

            %USERPROFILE%\Videos\Online Videos\IGN
            

            将文件夹更新为Daily Fix ...

            %USERPROFILE%\Videos\Online Videos\Video Games\IGN\Daily Fix
            

            将文件夹更新为Mass Effect ...

            %USERPROFILE%\Videos\Online Videos\Video Games\IGN\Daily Fix\Mass Effect
            

            等等......

            但是,如果我使用了类别和上传者列......

            UPDATE user_cats SET save_directory = ("%USERPROFILE%\Videos\Online Videos\" || category || "\" || uploader || "\" || NEW.folder) WHERE folder = NEW.folder;
            END;
            

            终于有效了! :)

            另外,我在插入新值时做了第二个语句处理,而不仅仅是在我更新时。所以,最后的TRIGGER陈述是......

            <强>解决方案:

            CREATE TRIGGER df_match_a
            AFTER UPDATE ON user_cats FOR EACH ROW
            BEGIN
            UPDATE user_cats SET save_directory = ("%USERPROFILE%\Videos\Online Videos\" || category || "\" || uploader || "\" || NEW.folder) WHERE folder = NEW.folder;
            END;
            
            CREATE TRIGGER df_match_b
            AFTER INSERT ON user_cats FOR EACH ROW
            BEGIN
            UPDATE user_cats SET save_directory = ("%USERPROFILE%\Videos\Online Videos\" || category || "\" || uploader || "\" || NEW.folder) WHERE folder = NEW.folder;
            END;
            
相关问题