- 第一个问题
两栏
create table test (word varchar(255),value int);
当我们有相同的 word
时,我如何更新表
例如:<a,1> ,<b,1> , <a,1>
将添加新行 <a,2>
并删除两个 <a,1>
行
2.第二个问题
如果表有数百对,并且表仍在分组(仍在插入),如何加快速度,我可以每 1 小时检查一次吗?并执行更新步骤?
MySQL 或 PHP 代码
最佳答案
如果目标是拥有一个具有唯一值 word
的表,那么我首先不允许插入具有相同单词值的行,而只是更新现有行。
我会强制 word
的唯一性列通过添加 UNIQUE KEY 或 PRIMARY KEY 约束。例如:
CREATE UNIQUE INDEX `test_ux1` ON `test` (`word`) ;
如果我想禁止 word
为 NULL 值,我会添加 NOT NULL
到列定义。例如:
ALTER TABLE `test` MODIFY `word` VARCHAR(255) NOT NULL ;
或者,我可以定义 word
成为表的主键,而不是唯一键。这将强制唯一性并不允许 NULL 值。
这里演示了如何插入和更新行。
我们可以首先尝试插入一行。在本例中,该行的 word
的值为“a”。栏目:
INSERT INTO `test` (`word`, `value`) VALUES ('a','1') ;
如果语句成功,我们就插入了一行。但在word
上有主键或唯一键列,这将引发“重复键”错误,因为表中已存在值为“a”的行。
当这种情况发生时,我们知道我们需要对现有行执行更新。例如:
UPDATE `test` t
SET t.`value` = IFNULL(t.`value`,0) + '1'
WHERE t.word = 'a'
MySQL 提供了一个扩展(INSERT ... ON DUPLICATE KEY UPDATE
语句),它将在单个语句中执行相同的操作:
INSERT INTO `test` (`word`,`value`) VALUES ('a','1')
ON DUPLICATE KEY
UPDATE `value` = IFNULL(`value`,0) + VALUES(`value`)
<小时/>
这种设计似乎比执行插入、插入稍后将通过删除操作撤消的行要高效得多。我希望只包含我需要的行,而不添加稍后需要查询和删除的额外行。
关于php - 更新表 当表分组并使用 MySQL 删除同一行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33511807/