MySQL将多行中的一行设置为默认值

MySQL将多行中的一行设置为默认值,mysql,performance,dataset,sql-update,default,Mysql,Performance,Dataset,Sql Update,Default,我有一个可能包含数百万条记录的表。我只希望该表中的一条记录是默认记录或选中记录。默认记录不能超过一条。我目前正在做的是我有一个名为defaulttinyint(1)UNIQUE的列,其中非默认值是1,其他所有值都是NULL。这在我有限的约100条记录的数据集中运行良好。每次更改默认值时,我都会运行以下查询: UPDATE table SET default = NULL; UPDATE table SET default = TRUE WHERE id = :chosen; 我预见到的问题是,

我有一个可能包含数百万条记录的表。我只希望该表中的一条记录是默认记录选中记录。默认记录不能超过一条。我目前正在做的是我有一个名为
defaulttinyint(1)UNIQUE
的列,其中非默认值是
1
,其他所有值都是
NULL
。这在我有限的约100条记录的数据集中运行良好。每次更改默认值时,我都会运行以下查询:

UPDATE table SET default = NULL;
UPDATE table SET default = TRUE WHERE id = :chosen;
我预见到的问题是,当记录的数量大幅增加时,我可以看到由于
更新
查询而导致的性能损失


我的问题是,有没有更好的方法来设置默认行,同时确保只有一行可以存在,而不管表中有多少行,它都可以快速工作?

您的第一个查询没有where子句,mysql将遍历整个表

添加一个默认值不为NULL的


此外,您还需要使用一个事务来确保两个线程在试图同时更改默认值时不会出错。如果不这样做,其中一个可能会出现重复的键错误。

为什么不通过dafault将列更改一次为NULL,而不是每次更改它呢

ALTER TABLE MyTable ALTER COLUMN foo SET DEFAULT NULL ;
然后运行更新
default
您选择的id

UPDATE table SET default = TRUE WHERE id = :chosen;

另一种方法是进行一次全面更新:

UPDATE table SET default = (id = :chosen);

这将为给定id设置默认标志为true,为所有其他记录设置默认标志为false。

此方法要求mysql用户具有alter table权限,不是吗?另外,如果我只修改表一次,当我选择默认值两次时,第二个查询将运行两次。但是我如何删除第一个默认值呢?正如我所说的,首先运行一次并删除它。