更新表当表格分组并使用MySQL删除同一行时

时间:2015-11-04 00:41:48

标签: php mysql sql

  1. 第一个问题 两列create table test (word varchar(255),value int);
  2. 当我们有相同的word

    时,如何更新表格

    例如:<a,1> ,<b,1> , <a,1>将添加新行<a,2>并删除两个<a,1>

    2.第二个问题

    如果桌子有数百对,桌子还在分组(还是插入),如何加速,我可以每隔1小时检查一次吗?并进行更新步骤?

    MySQL或PHP代码

1 个答案:

答案 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`)

这种设计似乎比执行插入更有效,插入稍后将通过删除操作撤消的行。我更喜欢只拥有我需要的行,而不是添加需要在以后查询和删除的额外行。