0

我很难过为什么我不能在 bash 脚本中创建临时表。

这适用于命令提示符。

mysql> CREATE TEMPORARY TABLE snorby.delete_me (
       SELECT  cid AS del_cid 
       FROM snorby.event 
       WHERE timestamp < DATE_SUB(NOW(), INTERVAL 21 DAY) );
Query OK, 72 rows affected (0.08 sec)
Records: 72  Duplicates: 0  Warnings: 0

mysql> select * from snorby.delete_me limit 2;
+---------+
| del_cid |
+---------+
|       4 |
|       5 |
+---------+
2 rows in set (0.00 sec)

mysql> DROP TABLE snorby.delete_me;
Query OK, 0 rows affected (0.08 sec)

mysql>

但是当我从命令行执行此操作时,打算在 bash 脚本中使用它时,它不会生成表格。注意:这个 root 用户没有密码。

~$ sudo mysql -uroot -e "CREATE TEMPORARY TABLE snorby.delete_me (SELECT cid AS del_cid FROM snorby.event WHERE timestamp < DATE_SUB(NOW(), INTERVAL 21 DAY) );"
~$ sudo mysql -uroot -e "SELECT * FROM snorby.delete_me LIMIT 2;"
ERROR 1146 (42S02) at line 1: Table 'snorby.delete_me' doesn't exist

最后,如果我将这些命令放在 .sql 文件中并运行它们,它也可以正常工作。例子:

~$ mysql -uroot -e "SET @daystokeep=21; source snorby_del_old_by_days.sql;"

感谢barmar,我现在明白了。要从命令运行整个操作,如果使用临时表,它必须是一个命令。前任:

~$ sudo mysql -uroot -e "CREATE TEMPORARY TABLE snorby.delete_me (SELECT cid AS del_cid FROM snorby.event WHERE timestamp < DATE_SUB(NOW(), INTERVAL 21 DAY) ); SELECT * FROM snorby.delete_me LIMIT 2;  DROP TABLE snorby.delete_me;"

或者使用普通的桌子。

我感谢您的帮助。

4

2 回答 2

3

确实创建了表。然后它关闭会话,这会破坏表。找到另一种方法来做到这一点。

于 2013-09-19T01:46:32.580 回答
1

将您的代码更改为以下内容应该可以使其正常工作:

~$ sudo mysql -uroot -e "CREATE TEMPORARY TABLE snorby.delete_me (SELECT cid AS del_cid FROM snorby.event WHERE timestamp < DATE_SUB(NOW(), INTERVAL 21 DAY) ); SELECT * FROM snorby.delete_me LIMIT 2;"
于 2014-01-21T21:27:20.240 回答