我只是在表中添加一列,并将新列设置为外键。
我试图从语句中删除反引号。
以下是声明:
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
我确定它是一个简单的语法错误,但我找不到它
答案 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,并且要实现外键约束,则必须为表中的每一行分配一个值,该值引用目标表中的有效行。 (假设我们不会因为禁用外键而陷入困境。)