将外键列添加到现有表

时间:2019-04-11 21:25:57

标签: mysql foreign-keys alter

我只是在表中添加一列,并将新列设置为外键。

我试图从语句中删除反引号。

以下是声明:

ALTER TABLE `user_list_v4`
  ADD `role_id` int(11) NOT NULL COMMENT `role.id`
  KEY `role_id` (`role_id`),
  CONSTRAINT `developer_standup_timezone_ibfk_1` FOREIGN KEY 
(`role_id`) REFERENCES `role_list_v4` (`id`)

这是表格:

  CREATE TABLE `user_list_v4` (
  `id` int(11) NOT NULL,
  `fb_id` varchar(50) DEFAULT NULL,
  `google_id` varchar(50) DEFAULT NULL,
  `email` varchar(50) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT '',
  `lp_version` varchar(5) NOT NULL DEFAULT '',
  `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

运行该语句时,我希望它说:查询正常,受影响的0行(0.00秒)

但是我得到这个错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the 
manual that corresponds to your MySQL server version for the right 
syntax to use near '`role.id`
  KEY `role_id` (`role_id`),
  CONSTRAINT `developer_standup_timezone_' at line 2

我确定它是一个简单的语法错误,但我找不到它

2 个答案:

答案 0 :(得分:1)

您必须添加列,并且还要添加外键:

   ALTER TABLE `user_list_v4`
   ADD `role_id` INT NOT NULL COMMENT 'role.id', 
   ADD KEY `role_id` (`role_id`),
   ADD CONSTRAINT `developer_standup_timezone_ibfk_1` 
   FOREIGN KEY (`role_id`) REFERENCES `role_list_v4` (`id`);

答案 1 :(得分:1)

如果要创建新列NOT NULL,我认为我们需要分配一个DEFAULT值,以将其分配给现有行。

允许该列为null并分配默认值NULL更容易。

类似这样的东西:

ALTER TABLE `user_list_v4`
  ADD `role_id` int(11) DEFAULT NULL COMMENT 'role.id' 
, ADD KEY `role_id` (`role_id`)
, ADD CONSTRAINT `developer_standup_timezone_ibfk_1` 
      FOREIGN KEY (`role_id`) REFERENCES `role_list_v4` (`id`)
; 

如果我们了解要分别添加每个组件,则语法更有意义。我们正在添加一列。我们正在添加索引。并且我们添加了外键约束。我们可以通过三个单独的语句来达到相同的结果:

ALTER TABLE `user_list_v4`
  ADD `role_id` int(11) DEFAULT NULL COMMENT 'role.id' 
; 

ALTER TABLE `user_list_v4`
  ADD KEY `role_id` (`role_id`)
;

ALTER TABLE `user_list_v4`
  ADD CONSTRAINT `developer_standup_timezone_ibfk_1` 
      FOREIGN KEY (`role_id`) REFERENCES `role_list_v4` (`id`)
;

请注意,使用InnoDB,我们不必创建索引。当我们添加外键约束时,InnoDB将自动创建合适的索引。在单独的步骤中添加索引可以使我们更好地控制名称,并且可以添加其他列,等等。


如果我们需要新列为非NULL,并且要实现外键约束,则必须为表中的每一行分配一个值,该值引用目标表中的有效行。 (假设我们不会因为禁用外键而陷入困境。)