删除然后添加约束mysql导致重命名#1025错误

时间:2015-01-14 21:21:23

标签: mysql

创建表格:

CREATE TABLE `phppos_register_log` (
  `register_log_id` int(10) NOT NULL AUTO_INCREMENT,
  `employee_id` int(10) NOT NULL,
  `shift_start` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `shift_end` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `open_amount` decimal(23,10) NOT NULL,
  `close_amount` decimal(23,10) NOT NULL,
  `cash_sales_amount` decimal(23,10) NOT NULL,
  `deleted` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`register_log_id`),
  KEY `phppos_register_log_ibfk_1` (`employee_id`),
  CONSTRAINT `phppos_register_log_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `phppos_employees` (`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

要重命名列的SQL CODE :(这适用于mysql 5.5和5.6,但有一个用户报告了一个问题。(确切版本号5.5.40)

//this is where error is happening
ALTER TABLE phppos_register_log DROP FOREIGN KEY phppos_register_log_ibfk_1;


ALTER TABLE  `phppos_register_log` CHANGE  `employee_id`  `employee_id_open` INT( 10 ) NOT NULL ;
ALTER TABLE `phppos_register_log`ADD CONSTRAINT `phppos_register_log_ibfk_1` FOREIGN KEY (`employee_id_open`) REFERENCES `phppos_employees` (`person_id`);

mysql 5.5.40中的任何内容都会导致此代码无效吗?

ERROR报道:

#1025 - Error on rename of './sole_phppos_144/phppos_register_log' to './sole_phppos_144/#sql2-6224-22975' (errno: 152)

注意:我正在重命名列,因此我删除约束,重命名列,然后再添加约束。

2 个答案:

答案 0 :(得分:3)

更新: 我已经尝试了一些以前找到的解决方案不能正常工作,你不能在删除外键之前删除索引,如stackoverflow上的另一个引用所示。

但是,我能够找到重现错误的情况,即在同一个外键上执行DROP FOREIGN KEY两次。第二次它会产生这个错误。


更新前:

这家伙似乎已经弄明白了:http://lists.mysql.com/mysql/204199因为他的回答已在unable to drop the foreign key

中得到批准和引用

他提到索引键(KEY)可以防止外键掉线。所以他的建议是首先删除索引键,如:

ALTER TABLE phppos_register_log DROP KEY phppos_register_log_ibfk_1;

然后是外键:

ALTER TABLE phppos_register_log DROP FOREIGN KEY phppos_register_log_ibfk_1;

我希望它有效,但不幸的是,我自己无法重现错误,所以这个解决方案都没有。在我的系统上,它只是删除外键。

答案 1 :(得分:0)

我无法通过您提供的陈述重现这一点。但是你确定他们没有尝试按列名删除外键吗?

ALTER TABLE phppos_register_log DROP FOREIGN KEY employee_id;
ALTER TABLE phppos_register_log CHANGE employee_id employee_id_open INT NOT NULL;
ALTER TABLE `phppos_register_log`ADD CONSTRAINT `phppos_register_log_ibfk_1` 
FOREIGN KEY (`employee_id_open`) REFERENCES `phppos_employees` (`person_id`);

在SQLFiddle 5.5中生成您发布的相同错误。