首页 > 解决方案 > 删除未完全删除的外键约束

问题描述

我在users_id,并希望将字段值设置为允许 NULL 值和 DEFAULT NULL。

似乎外键约束已被删除,但不知何故我无法使该字段为 NULL。

ALTER TABLE tbl_name DROP FOREIGN KEY `fk_internal_team_has_users_users1`;

这是删除外键后的表模式:

 CREATE TABLE `internal_team_head` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `internal_team_id` int(11) NOT NULL,
  `users_id` int(11) NOT NULL DEFAULT '0',
  `type` enum('lead','project_manager') NOT NULL,
  `updated_by` int(6) DEFAULT NULL,
  `updated_on` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`,`internal_team_id`,`users_id`,`type`),
  KEY `fk_internal_team_has_users_users1_idx` (`users_id`),
  KEY `fk_internal_team_has_users_internal_team1_idx` (`internal_team_id`),
  CONSTRAINT `fk_internal_team_has_users_internal_team1` FOREIGN KEY (`internal_team_id`) REFERENCES `internal_team` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8

现在我想更改users_id为允许 NULL 值并默认为 NULL。

ALTER TABLE `internal_team_head` CHANGE `users_id` `users_id` INT(11) NULL DEFAULT NULL;

Alter 查询成功执行,但users_id Null属性仍设置为No,默认值设置为0

如何执行更改?

标签: mysqlsqlforeign-keys

解决方案


手册

  • 首要的关键

必须将所有键列定义为 NOT NULL 的唯一索引。如果它们没有被显式声明为 NOT NULL,MySQL 会隐含地(并且默默地)声明它们。

因此,解决方案是从主键中删除列。无论如何,你的PK设计毫无意义。auto_increment 列足以作为 PK。只有在最左边的列也被使用时,才会使用索引中的其他列。该行已由唯一索引 (auto_increment) 标识,因此无需这样做。
还要记住,你希望你的 PK 尽可能小。二级索引包括访问行的 PK。所以尽量避免不必要的开销。

我也很困惑,因为您的问题标题与您的问题无关。但是为了解决这个问题, aKEY不是 a FOREIGN KEY,它是一个索引。是的,命名是次优的。


推荐阅读