无法从终端设置外键检查= 0

时间:2015-01-13 23:32:13

标签: mysql sql linux terminal centos

我正在尝试从linux(CentOS 7)终端运行以下代码:

mysql -u root -p -e "SET FOREIGN_KEY_CHECKS = 0"; mysql -u root -p -Nse 'show tables' DATABASE_NAME  -u root -p| while read table; do mysql -u root -p -e "truncate table $table" DATABASE_NAME; done;  

但它显然没有处理set foreign key checks命令,因为我得到了回复:

ERROR 1701 (42000) at line 1: Cannot truncate a table referenced in a foreign key constraint (`atest`.`PARTICIPANT_2`, CONSTRAINT `FK_0a036647645f4e5e950470cb2dc` FOREIGN KEY (`PARTICIPANT_ACT_HJID`) REFERENCES `atest`.`ACT` (`HJID`))

此外,它继续问我密码。我希望它能要求3次输入密码,但不要一次又一次地重复这三个请求。如何更改上面的代码以使其正确运行,并且使用最少数量的密码请求?

编辑:

以下修改似乎要求循环中的每个表的密码。有500多张桌子。我怎么能解决这个问题所以它只要求密码几次?

mysql -u root -p -Nse 'show tables' DATABASE_NAME | while read table; do mysql -u root -p -e "SET FOREIGN_KEY_CHECKS = 0; truncate table $table" atest; done; 

1 个答案:

答案 0 :(得分:1)

foreign_key_checks是一个会话变量,它只对当前会话有效,直到它发生变化,或直到会话结束。

您正在创建多个数据库会话,每个新会话都以它自己的foreign_key_checks变量开头,设置为默认值(继承自全局设置)。 (我不会提到你如何改变默认值,因为你真的不想去那里。)

一种选择是在{em>相同的会话中执行SET FOREIGN_KEY_CHECKS语句作为TRUNCATE TABLE语句。

使用分号作为语句分隔符。作为运行两个陈述的演示:

mysql -u me -pXX -e "show variables like 'foreign%'; show variables like '%packet%';"