创建MySQL外键时无法选择被引用列的问题求助
MySQL外键创建失败:无法选择被引用列
创建product、site和product_site_ref三张表时,尝试为product_site_ref添加外键,可视化工具中无法选择被引用列(截图显示无法选择proizvod表的列,proizvod即product表)。
表结构
关联表 product_site_ref
CREATE TABLE `product_site_ref` ( `id` bigint(20) NOT NULL, `product_id` bigint(20) unsigned NOT NULL, `site_id` bigint(20) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), KEY `product_index` (`product_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Product表
CREATE TABLE `product` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `code` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `name` varchar(225) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Site表
CREATE TABLE `site` ( `id` bigint(20) NOT NULL, `name` varchar(245) DEFAULT NULL, `url` varchar(45) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
问题排查与解决
数据类型校验:
- product.id与product_site_ref.product_id均为
bigint(20) unsigned,类型完全匹配; - site.id与product_site_ref.site_id均为
bigint(20),类型匹配。
数据类型不符合外键要求的可能性排除。
- product.id与product_site_ref.product_id均为
绕过可视化工具,直接用SQL添加外键:
若可视化工具存在兼容性问题,执行以下SQL语句手动添加外键:添加product_id的外键约束:
ALTER TABLE product_site_ref ADD CONSTRAINT fk_product_site_ref_product FOREIGN KEY (product_id) REFERENCES product(id);添加site_id的外键约束:
ALTER TABLE product_site_ref ADD CONSTRAINT fk_product_site_ref_site FOREIGN KEY (site_id) REFERENCES site(id);检查数据一致性:
若执行SQL时报错,需检查product_site_ref中是否存在product_id未在product表中出现、或site_id未在site表中出现的记录,这类脏数据会导致外键创建失败。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

