mysql - 删除未完全删除的外键约束
问题描述
我在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
。
如何执行更改?
解决方案
从手册:
- 首要的关键
必须将所有键列定义为 NOT NULL 的唯一索引。如果它们没有被显式声明为 NOT NULL,MySQL 会隐含地(并且默默地)声明它们。
因此,解决方案是从主键中删除列。无论如何,你的PK设计毫无意义。auto_increment 列足以作为 PK。只有在最左边的列也被使用时,才会使用索引中的其他列。该行已由唯一索引 (auto_increment) 标识,因此无需这样做。
还要记住,你希望你的 PK 尽可能小。二级索引包括访问行的 PK。所以尽量避免不必要的开销。
我也很困惑,因为您的问题标题与您的问题无关。但是为了解决这个问题, aKEY
不是 a FOREIGN KEY
,它是一个索引。是的,命名是次优的。
推荐阅读
- angular - 如何通过 *ngFor 在 Firebase 数据库中的对象下显示对象内容
- java - 使用 Java 驱动程序方法在 MongoDB 子文档上检索 ObjectID
- neo4j - Cypher (Neo4j) 创建与所有其他节点的关系(除了它自己)
- python - 如何使用 matplotlib.pyplot 将顶部 y 轴的低点设置为低于高点
- python-3.x - 无法在pygame中添加多个敌人
- python - 如何使用套接字将元组列表从服务器发送到客户端?
- javascript - 事件在 JS 中被多次跟踪
- javascript - 我想用 Vue.js 在图像上创建一个 v-for 循环
- spring-boot - Spring-AMQP - 基于消息头的路由
- ruby-on-rails - Rails for 循环在第一次迭代后退出