将外键列添加到现有 table
Add foreign key column to existing table
我只是将一列添加到 table 并将该新列设为外键。
我试过从语句中删除反引号。
声明如下:
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`)
这是 Table:
// 列名已变成字母,原因...:
CREATE TABLE `user_list_v4` (
`a` int(11) NOT NULL,
`b` varchar(50) DEFAULT NULL,
`c` varchar(50) DEFAULT NULL,
`d` varchar(50) NOT NULL DEFAULT '',
`e` varchar(255) NOT NULL DEFAULT '',
`f` varchar(5) NOT NULL DEFAULT '',
`g` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`h` 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
我确定这是一个简单的语法错误,但我没有找到它
您必须添加列并且还要添加外键:
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`);
如果我们想创建一个新列 NOT NULL
,我认为我们需要分配一个 DEFAULT
值以分配给现有行。
允许列为空并分配默认值 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 会自动创建一个 suitable 索引。在单独的步骤中添加索引可以让我们更好地控制名称,我们可以添加额外的列等。
如果我们需要新列为非 NULL,并且我们想要实现外键约束,那么 table 中的每一行都必须分配一个引用有效行中的值目标 table。 (假设我们不打算禁用外键。)
我只是将一列添加到 table 并将该新列设为外键。
我试过从语句中删除反引号。
声明如下:
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`)
这是 Table: // 列名已变成字母,原因...:
CREATE TABLE `user_list_v4` (
`a` int(11) NOT NULL,
`b` varchar(50) DEFAULT NULL,
`c` varchar(50) DEFAULT NULL,
`d` varchar(50) NOT NULL DEFAULT '',
`e` varchar(255) NOT NULL DEFAULT '',
`f` varchar(5) NOT NULL DEFAULT '',
`g` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`h` 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
我确定这是一个简单的语法错误,但我没有找到它
您必须添加列并且还要添加外键:
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`);
如果我们想创建一个新列 NOT NULL
,我认为我们需要分配一个 DEFAULT
值以分配给现有行。
允许列为空并分配默认值 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 会自动创建一个 suitable 索引。在单独的步骤中添加索引可以让我们更好地控制名称,我们可以添加额外的列等。
如果我们需要新列为非 NULL,并且我们想要实现外键约束,那么 table 中的每一行都必须分配一个引用有效行中的值目标 table。 (假设我们不打算禁用外键。)