【问题标题】:unable to set foreign key checks =0 from terminal无法从终端设置外键检查 = 0
【发布时间】:2015-03-12 01:49:42
【问题描述】:

我正在尝试从 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;  

但它显然不处理设置外键检查命令,因为作为回应我得到:

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; 

【问题讨论】:

  • MySQL 正在处理 SET 语句。但是按照您的编码方式,它会在 separate 会话中执行该 SET 语句。看起来您希望在执行TRUNCATE TABLEsame 会话中更改该变量。可以运行多个语句。 (见我的回答。)

标签: mysql sql linux terminal centos


【解决方案1】:

foreign_key_checks 是一个会话变量,它只对当前会话有效,直到它被更改,或者直到会话结束。

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

一种选择是在与TRUNCATE TABLE 语句相同 的会话中执行SET FOREIGN_KEY_CHECKS 语句。

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

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

【讨论】:

  • 谢谢。那么这如何应用于我的 OP 中的代码?
  • -e "set foreign_key_checks = 0; truncate table $table;"
  • 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; 似乎在询问循环中每个表的密码。有 500 多张桌子。我该如何解决这个问题,让它只要求输入几次密码?
  • 谢谢你和 +1。我看到你在其他地方回答了问题的另一部分:stackoverflow.com/questions/27933828/…
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 2014-02-15
  • 2017-05-08
  • 2012-06-25
  • 1970-01-01
  • 2018-01-24
  • 2019-02-16
  • 1970-01-01
相关资源
最近更新 更多