【问题标题】:drop foreign key constraint not removed completely删除未完全删除的外键约束
【发布时间】:2018-06-22 08:37:10
【问题描述】:

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

如何执行更改?

【问题讨论】:

    标签: mysql sql foreign-keys


    【解决方案1】:

    来自manual

    • 主键

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

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

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

    【讨论】:

      【解决方案2】:

      试试这个:

      ALTER TABLE internal_team_head
      ALTER COLUMN users_id INT(11) NULL;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 2011-02-24
        • 2015-06-11
        相关资源
        最近更新 更多