当前位置: 首页 > 面试题库 >

使用现有的MYSQL数据库使用Alter Table添加外键时出现问题-无法添加!帮帮我!

孟晋
2023-03-14
问题内容

我有一个生产数据库,在其中我已重命名了几个作为外键的列。显然,以我的经验,mysql使这确实很痛苦。

我的解决方案是删除所有索引和外键,重命名id列,然后重新添加索引和外键。

这在用于开发数据库的Windows上的mysql 5.1上很好用。

我去了我的debian服务器上运行迁移脚本,该服务器也使用mysql 5.1,它给出了以下错误:

mysql> ALTER TABLE `company_to_module`
    -> ADD CONSTRAINT `FK82977604FE40A062` FOREIGN KEY (`company_id`) REFERENCES `company` (`company_id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
ERROR 1005 (HY000): Can't create table 'jobprep_production.#sql-44a5_76' (errno: 150)

该表中没有与我要添加的外键冲突的值。数据库未更改。外键DID在…之前存在,因此数据很好。更不用说我使用了服务器上拥有的SAME数据库,并且该数据库在Windows上可以正常迁移。但是这些相同的外键迁移并没有取代Debian。

列使用相同的类型-BIGINT(20)

这些名称实际上确实存在于它们各自的表中。

这些表是innodb。他们已经在其他列中保留了外键。这不是一个新的数据库。

我不能删除表,因为这是生产数据库。

表“按原样”在我的数据库中:

 CREATE TABLE `company_to_module` (
  `company_id` bigint(20) NOT NULL,
  `module_id` bigint(20) NOT NULL,
  KEY `FK8297760442C8F876` (`module_id`),
  KEY `FK82977604FE40A062` (`company_id`) USING BTREE,
  CONSTRAINT `FK8297760442C8F876` FOREIGN KEY (`module_id`) REFERENCES `module` (`module_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Create Table: CREATE TABLE `company` (
  `company_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `postal_code` varchar(255) DEFAULT NULL,
  `province_id` bigint(20) DEFAULT NULL,
  `phone_number` varchar(255) DEFAULT NULL,
  `is_enabled` bit(1) DEFAULT NULL,
  `director_id` bigint(20) DEFAULT NULL,
  `homepage_viewable` bit(1) NOT NULL DEFAULT b'1',
  `courses_created` int(10) NOT NULL DEFAULT '0',
  `header_background` varchar(25) DEFAULT '#172636',
  `display_name` varchar(25) DEFAULT '#ffffff',
  `tab_background` varchar(25) DEFAULT '#284767',
  `tab_text` varchar(25) DEFAULT '#ffffff',
  `hover_tab_background` varchar(25) DEFAULT '#284767',
  `hover_tab_text` varchar(25) DEFAULT '#f2e0bd',
  `selected_tab_background` varchar(25) DEFAULT '#f5f5f5',
  `selected_tab_text` varchar(25) DEFAULT '#172636',
  `hover_table_row_background` varchar(25) DEFAULT '#c0d2e4',
  `link` varchar(25) DEFAULT '#4e6c92',
  PRIMARY KEY (`company_id`),
  KEY `FK61AE555A71DF3E03` (`province_id`),
  KEY `FK61AE555AAC50C977` (`director_id`),
  CONSTRAINT `company_ibfk_1` FOREIGN KEY (`director_id`) REFERENCES `user_account` (`user_account_id`),
  CONSTRAINT `FK61AE555A71DF3E03` FOREIGN KEY (`province_id`) REFERENCES `province` (`province_id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8

这是innodb的状态:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110415  3:14:34 Error in foreign key constraint of table jobprep_production/#sql-44a5_1bc:
 FOREIGN KEY (`company_id`) REFERENCES `company` (`company_id`) ON DELETE RESTRICT ON UPDATE RESTRICT:
Cannot resolve column name close to:
) ON DELETE RESTRICT ON UPDATE RESTRICT

如果我尝试从“ company_to_module”中删除索引,则会出现此错误:

#1025 - Error on rename of './jobprep_production/#sql-44a5_23a' to './jobprep_production/company_to_module' (errno: 150)

这是我的innodb变量:

+---------------------------------+------------------------+
| Variable_name                   | Value                  |
+---------------------------------+------------------------+
| innodb_adaptive_hash_index      | ON                     |
| innodb_additional_mem_pool_size | 1048576                |
| innodb_autoextend_increment     | 8                      |
| innodb_autoinc_lock_mode        | 1                      |
| innodb_buffer_pool_size         | 8388608                |
| innodb_checksums                | ON                     |
| innodb_commit_concurrency       | 0                      |
| innodb_concurrency_tickets      | 500                    |
| innodb_data_file_path           | ibdata1:10M:autoextend |
| innodb_data_home_dir            |                        |
| innodb_doublewrite              | ON                     |
| innodb_fast_shutdown            | 1                      |
| innodb_file_io_threads          | 4                      |
| innodb_file_per_table           | OFF                    |
| innodb_flush_log_at_trx_commit  | 1                      |
| innodb_flush_method             |                        |
| innodb_force_recovery           | 0                      |
| innodb_lock_wait_timeout        | 50                     |
| innodb_locks_unsafe_for_binlog  | OFF                    |
| innodb_log_buffer_size          | 1048576                |
| innodb_log_file_size            | 5242880                |
| innodb_log_files_in_group       | 2                      |
| innodb_log_group_home_dir       | ./                     |
| innodb_max_dirty_pages_pct      | 90                     |
| innodb_max_purge_lag            | 0                      |
| innodb_mirrored_log_groups      | 1                      |
| innodb_open_files               | 300                    |
| innodb_rollback_on_timeout      | OFF                    |
| innodb_stats_on_metadata        | ON                     |
| innodb_support_xa               | ON                     |
| innodb_sync_spin_loops          | 20                     |
| innodb_table_locks              | ON                     |
| innodb_thread_concurrency       | 8                      |
| innodb_thread_sleep_delay       | 10000                  |
+---------------------------------+------------------------+

我还想补充一点,当我在玩添加外键时,mysql破坏了我的数据库并破坏了它。我必须从备份重新加载才能重试。

帮帮我?:/


问题答案:

我只是简单地使用Windows应用了重构,然后将数据库重新导入到Debian中-它可以工作。

我认为可以肯定地说,Debian服务器或Linux版本的Mysql弄乱了某些内容-也许是5.1版本的错误?

无论如何,我也将服务器上的ram从1gb升级到2gb,这些问题已经消失了。

我认为MySQL可能只是没有足够的内存来完成操作。如果真是这样(看来是这样),我认为MySQL应该只是这么说而不是吐出这些错误-
使我和这里的每个人都认为这是语法或与模式相关的问题。

无论如何,感谢那些试图提供帮助的人。至少它帮助我隔离了所有不可能的东西。



 类似资料:
  • 问题内容: 因此,当我想添加外键时出现错误。我在带有EER图模型的MySQL Workbench中添加了外键。工作台尝试添加的行是: 我得到的错误是: 我搜索了解决方案,发现括号很重要或反引号,但是由于代码是由该工具创建的,因此对我来说似乎是正确的。是什么导致错误? 问题答案: 对于任何看此的人,都可以在EER图模型窗口中设置要用于生成SQL脚本的MySQL版本。转到“编辑”,“首选项”,然后是“

  • 我想添加两个表,一个产品表和一个类别表。然后我要将产品表中的一个类别id链接到类别表中的主键。下面是我的代码: SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter table添加约束外键()引用())

  • 问题内容: 因此,我作为项目需求试图将外键约束添加到数据库中,并且它第一次或在两个不同的表上运行,但是在尝试添加外键约束时,我在两个表上遇到错误。我收到的错误消息是: 错误1215(HY000):无法添加外键约束 这是我用来创建表的SQL,两个有问题的表是和。 问题答案: 要查找特定错误,请运行以下命令: 并查看该部分。 子列的数据类型必须与父列完全匹配。例如,由于是,也需要是,而不是。 另外,您

  • 同时添加外键关系MySQL给出: 我有2个表,试图给外键与其他的关系,但它给下面的错误。 错误1005:无法创建表'yellowbikes.#sql-1e8_82'(errno: 121) SQL声明: 错误:运行故障回复脚本时出错。详情如下。 错误1050:表“计划”已存在 SQL声明:

  • 我正在做一个项目,从firebase(它是“排队的”)中提取数据。本质上,数据是以W/a时间戳的方式保存的,因此当调用数据时,可以按顺序排序(先进先出)。 我面临的问题是当我在我的应用程序上检索数据。根据我的研究,在堆栈溢出和firebase文档中,.value提供一个快照,并在添加新数据时继续监听数据。然而,当添加新数据时,它将获得整个集合的新快照(因此在我的应用程序数组上“复制数据”)。

  • 问题内容: 我正在使用JDBC与MySQL同步,以向MySQL数据库的表添加和定义行。问题是,当我使用类中的方法向表中添加行时,我不知道为什么会抛出一个。请记住,我之前已经尝试过通过方法读取表,并且它成功打印出了单元格值。以下是有关的代码断裂: 这是控制台: [更新] 加入后,在表列的成功添加行的表,现在,我只想知道为什么MySQL不接受请求,从添加新行如果列没有出现在该表? 问题答案: 如果您未