设计表有个字段设计错了,但本地已经有一些测试数据了,不想删表重建,又得费工夫导数据。

于是 modify 该字段,发现不生效。原来修改 unique 字段为非 unique 是要用删除索引的方法(unique 字段默认会创建索引),删除了索引,就不是 unique 了。

首先根据字段名查找关联的索引:

SHOW INDEX FROM table_name WHERE Column_name='column_name';

然后删除索引:

ALTER TABLE table_name DROP INDEX index_name;

举个例子

现有一张 user 表,不小心把 password 字段设置为 unique 的了:

CREATE TABLE IF NOT EXISTS `user`
(
    `id`         INT(10) UNSIGNED    NOT NULL AUTO_INCREMENT,
    `username`   VARCHAR(250) UNIQUE          DEFAULT NULL COMMENT '用户名',
    `phone`      VARCHAR(250) UNIQUE          DEFAULT NULL COMMENT '手机号',
    `password`   VARCHAR(250) UNIQUE          DEFAULT NULL COMMENT '密码',
    `age`        INT(10) UNSIGNED    NOT NULL DEFAULT 0 COMMENT '年龄',
    `sex`        TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '性别',
    `created_at` TIMESTAMP           NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = `utf8mb4` COMMENT = '用户表';

于是先查找 password 字段对应的索引名称:

SHOW INDEX FROM user WHERE Column_name='password';

2024-03-04T09:55:25.png

索引名也叫 password,删除该索引:

ALTER TABLE user DROP INDEX password;

再次查看 user 表,索引已被删除,问题解决。

2024-03-04T09:56:33.png

标签: mysql, unique