Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
Mysql 如何使用其他连接表中的记录存档记录?_Mysql_Triggers - Fatal编程技术网

Mysql 如何使用其他连接表中的记录存档记录?

Mysql 如何使用其他连接表中的记录存档记录?,mysql,triggers,Mysql,Triggers,我有8张桌子: users: uid users_removed: uid messages: mid uid FK users (uid) messages_removed: mid uid comments: cid mid FK messages (mid) comments_removed: cid mid files: fid mid FK messages (mid) files_removed: fid mid 当我从表“u

我有8张桌子:

users:
  uid
users_removed:
  uid
messages:
  mid
  uid FK users (uid)
messages_removed:
  mid
  uid
comments:
  cid
  mid FK messages (mid)
comments_removed:
  cid
  mid
files:
  fid
  mid FK messages (mid)
files_removed:
  fid
  mid
当我从表“users”中删除记录时,我希望将其移动到表users\u removed(从用户中删除之前)。我还希望将所有相应的消息(以及文件和注释)移动到*\u已删除的表中

我用过触发器:

CREATE TRIGGER delete_user BEFORE DELETE ON users
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO users_removed
            SELECT * FROM users WHERE uid = OLD.uid;
        DELETE FROM messages WHERE OLD.uid in (owner_id, author_id);
    END
|

CREATE TRIGGER delete_message BEFORE DELETE ON messages
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO messages_removed
            SELECT * FROM messages WHERE mid = OLD.mid;
        DELETE FROM comments WHERE mid = OLD.mid;
        DELETE FROM files WHERE mid = OLD.mid;
    END
|

CREATE TRIGGER delete_comment BEFORE DELETE ON comments
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO comments_removed
            SELECT * FROM comments WHERE cid = OLD.cid;
    END
|

CREATE TRIGGER delete_file BEFORE DELETE ON files
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO files_removed
            SELECT * FROM files WHERE fid = OLD.fid;
    END
|
但对于超过5万用户、超过100万条消息、评论和文件,它的运行速度非常慢

有什么快速的方法吗

  • 没有快速的方法可以做到这一点。假设您使用的是InnoDB,您必须编写一个表项,删除一个表项引用,然后InnoDB执行第二次清理运行以实际删除它(删除是昂贵的)。然后,随着时间的推移删除更多用户,数据库中的漏洞几乎肯定最终会影响性能

  • 如果要保存用户信息,为什么不在用户表中添加一个名为“active”的列,并使用enum(true,false)进行保存

  • 没有快速的方法可以做到这一点。假设您使用的是InnoDB,您必须编写一个表项,删除一个表项引用,然后InnoDB执行第二次清理运行以实际删除它(删除是昂贵的)。然后,随着时间的推移删除更多用户,数据库中的漏洞几乎肯定最终会影响性能

  • 如果要保存用户信息,为什么不在用户表中添加一个名为“active”的列,并使用enum(true,false)进行保存


  • 我可能会把它作为一列放在表中。我可能会把它作为一列放在表中。嗯。。。我不能使用“active”字段,因为我大量使用该表,并且添加了另一个过滤器(active=true)使其读取速度非常慢。好啊因此,假设我不希望它太快。我不用锁桌子就够了。有什么办法吗?开始/*这里有工作*/;犯罪你在用InnoDB,对吧?嗯。。。我不能使用“active”字段,因为我大量使用该表,并且添加了另一个过滤器(active=true)使其读取速度非常慢。好啊因此,假设我不希望它太快。我不用锁桌子就够了。有什么办法吗?开始/*这里有工作*/;犯罪您正在使用InnoDB,对吗?