Mysql只有在与前一行不同时插入新行

时间:2013-07-26 10:48:08

标签: php mysql sql

您好,我已经阅读了很多关于它的问题,但我没有找到问题的答案。问题是这样的: 我在MYSQL中有一个表,结构如下:

CREATE TABLE`Danni_Prekusvachi` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `prekusvach_id` int(11) NOT NULL,
  `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `IzkOtZashtita` bit(1) NOT NULL,
  `VklPrek` bit(1) NOT NULL,
  `cVkl` bit(1) NOT NULL,
  `cIzkl` bit(1) NOT NULL,
  `greshki` text NOT NULL,
  `komentari` varchar(255) NOT NULL,
  `prava_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `prekusvach_id` (`prekusvach_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

INSERT INTO `Danni_Prekusvachi` (`id`, `prekusvach_id`, `data`, `IzkOtZashtita`, `VklPrek`, `cVkl`, `cIzkl`, `greshki`, `komentari`) VALUES
(1, 1, '2013-07-25 13:07:24', b'1', b'0', b'0', b'1', '', ''),
(2, 1, '2013-07-25 13:07:25', b'1', b'0', b'0', b'1', '', '');

ALTER TABLE `Danni_Prekusvachi`
  ADD CONSTRAINT `Danni_Prekusvachi_ibfk_1` FOREIGN KEY (`prekusvach_id`) REFERENCES `Prekusvachi` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE;

我每隔一秒左右插入一次数据。我想在其中一个冒号中插入数据 IzkOtZashtitaVklPrekcVklcIzkl已更改其值。 现在我正在考虑用php检查最后插入的行是否相同,但是我的数据库将有大约50000行,因此随着数据库变大会变慢。

有没有办法在一个查询中进行检查和插入,或者我必须调用它两次以检查值?

编辑:我想仅在值与已使用相同prekusvach_id的最后一个插入行相比发生更改时插入。因此,假设如果在一秒钟内cVkl的值从1变为0,我应该插入新行。但是如果cVkl的值仍然相同(1比1),我不应该插入新行

6 个答案:

答案 0 :(得分:0)

您可以使用触发器。更新时有触发器。或者您只是使用sipmlear的php查询进行设置并检查值是否有变化。不到1百万记录的数据库往往相当快,但您也应该不时进行重新索引,以便您的查询更快。

答案 1 :(得分:0)

复合唯一约束。

alter table Danni_Prekusvachi add unique index(IzkOtZashtita, VklPrek, cVkl, cIzkl);

编辑: 比前一个还是以前的一个?

答案 2 :(得分:0)

我很确定你应该在设计阶段解决这个问题。从它的外观来看,你试图每秒插入一条新记录,但只有在这些秒之间发生了某些事情。

为什么不在这个特定事件(改变你的值)发生后插入记录?

答案 3 :(得分:0)

将检查抽象到数据库层。因此,编写一个过程来检查值是否已更改,如果是,则添加新行。对你和数据库的一个呼吁是做你的工作,而不是你。

答案 4 :(得分:0)

看一下REPLACE语句,它可能就是你要找的东西。

MySQL Manual - REPLACE

答案 5 :(得分:0)

假设UID是一个顺序运行的唯一ID,您可以从UID字段包含最大值的记录中检查给定字段的值,并仅在给定字段的值时插入新记录('在我的例子中,id不同于' id'最后创建的记录中的字段。

INSERT INTO  'Danni_Prekusvachi' (`id`, `prekusvach_id`, `data`, `IzkOtZashtita`, `VklPrek`, `cVkl`, `cIzkl`, `greshki`, `komentari`) VALUES
(1, 1, '2013-07-25 13:07:24', b'1', b'0', b'0', b'1', '', ''),
(2, 1, '2013-07-25 13:07:25', b'1', b'0', b'0', b'1', '', '')
SELECT * FROM (SELECT * FROM  'Danni_Prekusvachi' WHERE UID = (SELECT MAX(UID)  FROM TABLE)) AS tmp) WHERE NOT tmp.id = id 
)