MySQL默认设置多行中的一行

时间:2014-07-01 07:57:50

标签: mysql performance dataset sql-update default

我有一张表可能包含数百万条记录。我希望该表中只有一条记录为默认选择记录。永远不会有多个默认记录。我目前正在做的是我有一个名为default TINYINT(1) UNIQUE的列,其中非默认值为1,其他所有内容都为NULL。这在我的约100个记录的有限数据集中工作正常。每当我更改默认值时,我都会运行以下查询:

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

我预见的问题是当记录数量大幅增加时,由于UPDATE查询,我可以看到性能下降。

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

3 个答案:

答案 0 :(得分:0)

你的第一个查询没有where子句,而mysql将通过整个表。

为其添加WHERE default IS NOT NULL

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

答案 1 :(得分:0)

为什么不在默认情况下将列更改为NULL,而不是每次更改它时。

ALTER TABLE MyTable ALTER COLUMN foo SET DEFAULT NULL ;

然后您运行更新default您选择的ID

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

答案 2 :(得分:0)

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

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

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