【发布时间】:2016-01-18 12:22:32
【问题描述】:
我正在尝试使用以下命令在 mysql 表中创建一个新列:
更改表PEDIDOS_DETALHE
添加列QTD_CAIXAS INT NOT NULL DEFAULT '0';
当我执行这个命令时,我得到以下错误:
错误代码:1050。表 'magazine/#sql-ib583' 已存在
mysql 在另一个名称的表中给出错误。
有什么问题?我没理解错误。
非常感谢
安德烈
【问题讨论】:
标签: mysql
我正在尝试使用以下命令在 mysql 表中创建一个新列:
更改表PEDIDOS_DETALHE
添加列QTD_CAIXAS INT NOT NULL DEFAULT '0';
当我执行这个命令时,我得到以下错误:
错误代码:1050。表 'magazine/#sql-ib583' 已存在
mysql 在另一个名称的表中给出错误。
有什么问题?我没理解错误。
非常感谢
安德烈
【问题讨论】:
标签: mysql
试试这个方法
ALTER TABLE table_name ADD COLUMN IF NOT EXISTS column_name tinyint(1) DEFAULT 0;
【讨论】:
在我的情况下,问题是缺少ALTER 权限,所以我不得不授予它
mysql -u root -p
/* type your password */
GRANT ALTER ON yourschema.* TO 'youruser'@'%';
如果没有这个权限,MySQL Workbench 会修改原始的 ALTER 查询并尝试创建我的表——显然失败了,因为表已经存在。
【讨论】:
听起来你有一个孤立的临时表。
查看以下链接中的“孤立的中间表”部分以进行故障排除:
https://dev.mysql.com/doc/refman/5.0/en/innodb-troubleshooting-datadict.html
如果 MySQL 在 ALTER TABLE 操作的中间崩溃,您可能会留下一个孤立的中间表。中间表名以“#sql-”开头。在您的数据目录中,您将看到一个#sql-.ibd 文件和一个随附的同名#sql-.frm 文件。中间表也列在 Table Monitor 输出中。
如果 #sql-.ibd 和 #sql-.frm 文件都出现在您的数据目录中,请通过发出 DROP TABLE 语句删除中间表,并将表名括在反引号中。例如:
mysql> 删除表
#sql-1291_3; 查询正常,0 行受影响(0.01 秒)需要将表名括在反引号中才能对带有特殊字符(例如“#”)的表名执行 SQL 语句。
如果您的数据目录中没有表格式文件(#sql-.frm 文件)或 DROP TABLE 操作失败,则创建一个与 #sql- 的表架构匹配的新 .frm 文件 em>.ibd 文件(它必须定义相同的列和索引)。为此,请执行以下步骤:
确定 #sql-*.ibd 文件是否具有 pre-ALTER 或 post-ALTER 模式定义。您可以使用表监视器查看中间表的列和索引。
确定#sql-.ibd 文件是否具有pre-ALTER 或post-ALTER 模式定义后,请在不同的数据库目录中创建匹配的#sql-.frm 文件。例如,如果一个中间表有一个 post-ALTER 模式定义,则创建一个 .frm 文件来匹配更改后的模式定义:
mysql> CREATE TABLE tmp LIKE employees.salaries; ALTER TABLE tmp DROP COLUMN to_date; 查询正常,0 行受影响(0.02 秒)
查询正常,0 行受影响(0.06 秒) 记录:0 重复:0 警告:0
将 .frm 文件复制到孤立表所在的数据库目录并重命名以匹配#sql-*.ibd 文件的名称
shell> cp tmp.frm employees/#sql-sql-1291_3.frm
通过发出 DROP TABLE 语句删除中间表,将表名括在反引号中。例如:
mysql> 删除表
#sql-1291_3; 查询正常,0 行受影响(0.01 秒)
【讨论】: