我有一个这样定义的表:
CREATE TABLE `Message` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`user_id` integer NOT NULL,
`user_to` integer NOT NULL,
`top_num` integer NOT NULL,
`priority` smallint NOT NULL,
`error` varchar(120) NOT NULL,
UNIQUE (`user_id`, `user_to`, `top_num`)
);
字符串
后来,我添加了另一列msg_type,如下所示:
ALTER TABLE Message ADD COLUMN msg_type SMALLINT(6) NOT NULL DEFAULT 0;
型
但是,我逐渐意识到,我需要将原来的UNIQUE
约束更改为包含msg_type
。我试着逃跑
ALTER TABLE Message
ADD UNIQUE INDEX (`user_id`, `user_to`, `top_num`, `msg_type`);
型
但是插入到我的表中仍然失败,错误消息指出这是因为旧的唯一性约束失败。
当我在mysql中调用describe Messages
时,我看到以下内容:
+-----------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | MUL | NULL | |
| user_to | int(11) | NO | MUL | NULL | |
| top_num | int(11) | NO | MUL | NULL | |
| priority | smallint(6) | NO | | NULL | |
| error | varchar(120) | NO | | NULL | |
| msg_type | smallint(6) | NO | | 0 | |
+-----------------+----------------------+------+-----+---------+----------------+
型
这使得它看起来像msg_type
真的不是约束的一部分…除了重新创建表之外,如何更改定义表时使用的约束?
4条答案
按热度按时间4uqofj5v1#
如前面的答案
to change foreign key constraint
使用步骤:**第一步:**删除旧约束:
字符串
**第二步:**新增:
型
使用SHOW CREATE TABLE了解约束的名称:
型
如果选中:
型
Key_name
是user_id
,它是UNIQUE (user_id ....
中的第一个参数假设你这样写:
型
然后你必须放弃使用
user_to
作为:型
ozxc1zmp2#
这是因为您正在添加唯一索引。请先删除唯一索引,然后添加唯一约束。
字符串
现在添加唯一约束。
型
1aaf6o9v3#
这是因为尚未删除已创建的第一个唯一约束。现在,您的表上有两个唯一的约束。
要删除唯一约束,请查看这篇文章Dropping Unique constraint from MySQL table
wribegjk4#
这是因为您正在添加唯一索引。请先删除唯一索引,然后添加唯一约束。DROP INDEX index_name ON table_name
现在添加唯一约束。
字符串