create table test (word varchar(255),value int);
当我们有相同的word
例如:<a,1> ,<b,1> , <a,1>
将添加新行<a,2>
并删除两个<a,1>
行
2.第二个问题
如果桌子有数百对,桌子还在分组(还是插入),如何加速,我可以每隔1小时检查一次吗?并进行更新步骤?
MySQL或PHP代码
答案 0 :(得分:0)
如果目标是拥有唯一值为word
的表,那么我就不允许在第一行中插入具有相同字值的行放置,只需更新现有行。
我会通过添加UNIQUE KEY或PRIMARY KEY约束来强制word
列的唯一性。例如:
CREATE UNIQUE INDEX `test_ux1` ON `test` (`word`) ;
如果我想禁止word
的NULL值,我会将NOT NULL
添加到列定义中。例如:
ALTER TABLE `test` MODIFY `word` VARCHAR(255) NOT NULL ;
或者,我可以将word
定义为表的PRIMARY KEY,而不是UNIQUE KEY。这将强制执行唯一性以及禁止NULL值。
这里演示了如何工作,插入和更新行。
我们可以先尝试插入一行。在这种情况下,该行的值为&#39; a&#39;对于word
列:
INSERT INTO `test` (`word`, `value`) VALUES ('a','1') ;
如果声明成功,我们已插入一行。但是如果使用word
列上的主键或唯一键,则会抛出一个重复的键&#34;错误,因为一行值为&#39; a&#39;已经存在于表格中。
当发生这种情况时,我们知道我们需要执行现有行的UPDATE。例如:
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`)
这种设计似乎比执行插入更有效,插入稍后将通过删除操作撤消的行。我更喜欢只拥有我需要的行,而不是添加需要在以后查询和删除的额外行。