我在 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/