mysql 更改活动表以使键不唯一

epggiuax  于 2023-04-19  发布在  Mysql
关注(0)|答案(6)|浏览(130)

我看到了一些与此相关的其他问题,但它们不是MySQL。
数据库是一个活动的数据库,所以我不想删除和重新创建表,我只是想让一个列不再唯一,这在本质上是不太允许的,所以它不应该引起任何问题。

jtjikinw

jtjikinw1#

如果您的列使用UNIQUE子句定义为唯一,则用途:

ALTER TABLE mytable DROP INDEX constraint_name

,或者,如果约束是隐式命名的,

ALTER TABLE mytable DROP INDEX column_name

如果使用PRIMARY KEY子句定义了unique,则用途:

ALTER TABLE mytable DROP PRIMARY KEY

但是,请注意,如果表是InnoDB,删除PRIMARY KEY将导致隐式地重新创建表并重建所有索引,这将锁定表,并可能使其在相当长的时间内无法访问。

k5ifujac

k5ifujac2#

以下是phpmyadmin应用程序的说明(如果您使用的是phpMyAdmin)::
在某些情况下,开发人员(您)可能不想删除它,而只是将“唯一性”修改为“非唯一性”。
步骤:
1.转到要进行修改的上下文中的表
1.点击“结构”选项卡(主要是浏览旁边)
1.找到“+索引”链接,就在列下面。是的…现在点击它
1.现在你可以看到所有的“索引”,你现在可以点击“删除”按钮或链接进行修改。
答案在这里找到:来源:https://forums.phpfreaks.com/topic/164827-phpmyadmin-how-to-make-not-unique/

dhxwm5r4

dhxwm5r43#

只要DROP唯一索引。这是一个活动数据库,这应该不会有问题。如果它是一个非常大的表,你可能会在删除索引时暂时阻止一些查询。但是,只有在添加索引时才会发生这种情况。

ALTER TABLE table_name DROP INDEX index_name;
nimxete2

nimxete24#

虽然公认的答案是不正确的(见评论),但建议的变通方法是可能的。但它也不正确,至少对于一个“活表”,正如所问的那样。
为了降低影响,您应该首先创建一个新索引,然后删除旧索引:

ALTER TABLE mytable ADD INDEX idx_new (column);
ALTER TABLE mytable DROP INDEX idx_old;

这避免了使用没有索引的表(列),这对客户端和MySQL本身来说都是非常痛苦的。

dwbf0jvd

dwbf0jvd5#

  • MySQL需要对外键和引用的键建立索引,以便快速进行外键检查 * (MySQL Manual).

如果要使其不唯一的唯一键被外键约束使用,则在删除它时会出现错误。您必须在同一行重新创建它:

alter table mytable drop KEY myUniqueKey, add key myUniqueKey (myColumn);
yqhsw0fo

yqhsw0fo6#

您需要删除与该列名关联的约束或索引。要删除它,您需要删除它。以下是您的操作方法:
首先,查找唯一索引或唯一约束的名称。您可以使用以下查询查找索引名称:

SELECT DISTINCT
    TABLE_NAME,
    COLUMN_NAME,
    CONSTRAINT_NAME
FROM
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
    TABLE_SCHEMA = 'your_database_name' AND
    TABLE_NAME = 'your_table_name' AND
    COLUMN_NAME = 'the_column_that_is_unique';

例如,我们在数据库animals中有一个表pets,每个pets都有一个幸运数字。由于错误,我们使lucky_number列唯一,但pets可以有相同的幸运数字。下面是我们如何找到与该列相关联的约束:

SELECT DISTINCT
    TABLE_NAME,
    COLUMN_NAME,
    CONSTRAINT_NAME
FROM
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
    TABLE_SCHEMA = 'animals' AND
    TABLE_NAME = 'pets' AND
    COLUMN_NAME = 'lucky_number';

我们必须得到以下输出:output
在此之后,我们需要删除它。我们可以通过运行以下命令来完成:

ALTER TABLE table_name DROP INDEX constraint_name;

在我们的例子中,上面的命令变为:

ALTER TABLE pets DROP INDEX lucky_number;

相关问题