我有一张表可能包含数百万条记录。我希望该表中只有一条记录为默认或选择记录。永远不会有多个默认记录。我目前正在做的是我有一个名为default TINYINT(1) UNIQUE
的列,其中非默认值为1
,其他所有内容都为NULL
。这在我的约100个记录的有限数据集中工作正常。每当我更改默认值时,我都会运行以下查询:
UPDATE table SET default = NULL;
UPDATE table SET default = TRUE WHERE id = :chosen;
我预见的问题是当记录数量大幅增加时,由于UPDATE
查询,我可以看到性能下降。
我的问题是,有没有更好的方法来设置默认行,同时确保只有一个可以存在,无论表中的行数多少都可以快速工作?
答案 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。