mysql 更改现有唯一约束

z9smfwbn  于 2023-08-02  发布在  Mysql
关注(0)|答案(4)|浏览(132)

我有一个这样定义的表:

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真的不是约束的一部分…除了重新创建表之外,如何更改定义表时使用的约束?

4uqofj5v

4uqofj5v1#

如前面的答案to change foreign key constraint使用步骤:

**第一步:**删除旧约束:

ALTER TABLE `Message` DROP INDEX `user_id`;

字符串

**第二步:**新增:

ALTER TABLE `Message` ADD UNIQUE INDEX (
         `user_id`, 
         `user_to`, 
         `top_num`, 
         `msg_type`);


使用SHOW CREATE TABLE了解约束的名称:

mysql> SHOW CREATE TABLE `Message` ;

| Message | CREATE TABLE `Message` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `user_to` int(11) NOT NULL,
  `top_num` int(11) NOT NULL,
  `priority` smallint(6) NOT NULL,
  `error` varchar(120) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`,`user_to`,`top_num`)
--           ^^^^^^^^^  name 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |


如果选中:

mysql> SHOW INDEX FROM `Message`;


Key_nameuser_id,它是UNIQUE (user_id ....中的第一个参数
假设你这样写:

ALTER TABLE `Message` ADD UNIQUE INDEX ( 
      `user_to`, 
      `user_id`, 
      `top_num`, 
      `msg_type`);


然后你必须放弃使用user_to作为:

ALTER TABLE `Message` DROP INDEX `user_to`;

ozxc1zmp

ozxc1zmp2#

这是因为您正在添加唯一索引。请先删除唯一索引,然后添加唯一约束。

-- you have to drop each index one by one.
ALTER TABLE Message DROP UNIQUE INDEX user_id;

字符串
现在添加唯一约束。

ALTER TABLE Message ADD CONSTRAINT uc_message UNIQUE (`user_id`, `user_to`, `top_num`, `msg_type`);

1aaf6o9v

1aaf6o9v3#

这是因为尚未删除已创建的第一个唯一约束。现在,您的表上有两个唯一的约束。
要删除唯一约束,请查看这篇文章Dropping Unique constraint from MySQL table

wribegjk

wribegjk4#

这是因为您正在添加唯一索引。请先删除唯一索引,然后添加唯一约束。DROP INDEX index_name ON table_name
现在添加唯一约束。

ALTER TABLE Message 
     ADD CONSTRAINT uc_message UNIQUE ((`user_id`, `user_to`, `top_num`, `msg_type`);)

字符串

相关问题