Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 请参阅另一个表';触发器中的s列?_Sqlite - Fatal编程技术网

Sqlite 请参阅另一个表';触发器中的s列?

Sqlite 请参阅另一个表';触发器中的s列?,sqlite,Sqlite,鉴于: 以下是: CREATE TABLE worktags ( worktag_id integer not null primary key, worktag character(32) not null default '' unique, ... last_updated character(32) not null default '[Error]' );

鉴于:

以下是:

CREATE TABLE worktags (
        worktag_id      integer         not null primary key,
        worktag         character(32)   not null default '' unique,

            ...
        last_updated    character(32)   not null default '[Error]'
);
CREATE TABLE truefacts (
        about           character(32)   not null primary key,
        fact            character(32)   not null
);
给出了错误:

错误:第52行附近:没有这样的列:truefacts.fact

但该列是存在的,并且似乎表明

[[schema name.]table name.]列名


是一个合法的
expr
,用于
SET column name=expr
的右侧。您需要使用子查询来访问其他(truefacts)表(因为任何地方都没有来自truefacts的),例如:-

也就是说,不需要触发器,因为子查询可以嵌入到更新中

例如,考虑下面的例子:-< /P>
CREATE TRIGGER zz_worktags_last_updated AFTER UPDATE ON worktags BEGIN
  UPDATE worktags SET
    last_updated = (SELECT fact FROM truefacts WHERE about = 'Last Worktag Update');
END;
这:-

  • 删除表和触发器(如果存在)(以便可以重新运行)
  • 将2张表格装入板条箱并填充
  • 选择worktags表中的所有内容(仅1行)

  • 使用子查询更新worktags表中的行(这是不需要触发器的示例)

  • 更新(无触发器)工作标签表中选择所有内容
  • 更新truefacts的事实列(以显示触发器工作) 6.创建触发器
  • 更新worktags表中的行,更改worktag列,保留触发器对上次更新列的更改
  • 从触发器更新的工作标签表中选择所有内容
  • 在中运行上述结果:-

    最后


    谢谢,非常有帮助。我有一个大的表,它会被数据定期刷新,这意味着一个程序将用许多“UPSERT”命令编写一个文件。我希望使用触发器可以缩短这些命令,因为它们已经非常长了。
    CREATE TRIGGER zz_worktags_last_updated AFTER UPDATE ON worktags BEGIN
      UPDATE worktags SET
        last_updated = (SELECT fact FROM truefacts WHERE about = 'Last Worktag Update');
    END;
    
    DROP TRIGGER IF EXISTS zz_worktags_last_updated;
    DROP TABLE IF EXISTS worktags;
    DROP TABLE IF EXISTS truefacts;
    CREATE TABLE worktags (
            worktag_id      integer         not null primary key,
            worktag         character(32)   not null default '' unique,
            last_updated    character(32)   not null default '[Error]'
    );
    CREATE TABLE truefacts (
            about           character(32)   not null primary key,
            fact            character(32)   not null
    );
    
    INSERT INTO truefacts VALUES('Last Worktag Update','xxx');
    INSERT INTO worktags (worktag,last_updated) VALUES('mytag',(datetime('now')));
    SELECT * FROM worktags;
    UPDATE worktags SET last_updated = (SELECT fact FROM truefacts WHERE about = 'Last Worktag Update'), worktag = 'aaaa' WHERE worktag_id = 1;
    SELECT * FROM worktags;
    
    UPDATE truefacts SET fact = 'zzzz' WHERE rowid = 1;
    CREATE TRIGGER zz_worktags_last_updated AFTER UPDATE ON worktags BEGIN
    UPDATE worktags SET
        last_updated = (SELECT truefacts.fact FROM truefacts WHERE truefacts.about = 'Last Worktag Update');
    END;
    
    UPDATE worktags SET worktag = 'bbbb' WHERE worktag_id = 1;
    SELECT * FROM worktags;