删除外键约束未完全删除

时间:2018-06-22 08:37:11

标签: mysql sql foreign-keys

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

如何执行更改?

2 个答案:

答案 0 :(得分:1)

来自manual

  
      
  • 主键
  •   
     

唯一索引,其中所有键列必须定义为NOT NULL。如果未将它们显式声明为NOT NULL,则MySQL会如此隐式(无声地)声明它们。

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

我也感到困惑,因为您的问题标题与您的问题无关。但是,为了解决该问题,NoMethodError: undefined method `confirm' for #<User:0x00007fd0781e0370> test/controllers/categories_controller_test.rb:15 不是KEY,它是一个索引。是的,命名不理想。

答案 1 :(得分:0)

尝试一下:

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