我在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
。
如何执行更改?
答案 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;