mysql - 删除外键约束未完全删除

标签 mysql sql foreign-keys

我在 users_id 字段中删除了一个外键约束,并希望将字段值设置为允许 NULL 值和 DEFAULT NULL。

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

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.

我如何实现更改?

最佳答案

来自manual :

  • PRIMARY KEY

A unique index where all key columns must be defined as NOT NULL. If they are not explicitly declared as NOT NULL, MySQL declares them so implicitly (and silently).

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

我也很疑惑,因为你的问题标题与你的问题无关。但同样要解决该问题,KEY 不是FOREIGN KEY,它是一个索引。是的,命名不是最理想的。

关于mysql - 删除外键约束未完全删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50983931/

相关文章:

php - Codeigniter active record 如何连接五个表

MySQl - AVG ( AVG IF) & 分组依据

mysql - 尝试按 SQL 中具有最新日期的字段进行分组,其中另一个字段相同

mysql - 如何在插入行时更新外键?

mysql - 由于外键无法创建表

php - 使用 php 和 mysql 导出生成的 excel 文件大小非常大

SQL用于解析多行数据?

mysql - 如何通过 id 列表(包括重复的 id)获取行?

sql - 如何在 Informix 4gl 中引用 TEXT 类型?

mysql - 如何修复 SQL 中的外键错误