创建表格:
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)
注意:我正在重命名列,因此我删除约束,重命名列,然后再添加约束。
答案 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中生成您发布的相同错误。