您好,我已经阅读了很多关于它的问题,但我没有找到问题的答案。问题是这样的: 我在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;
我每隔一秒左右插入一次数据。我想在其中一个冒号中插入数据
IzkOtZashtita
,VklPrek
,cVkl
或cIzkl
已更改其值。
现在我正在考虑用php检查最后插入的行是否相同,但是我的数据库将有大约50000行,因此随着数据库变大会变慢。
有没有办法在一个查询中进行检查和插入,或者我必须调用它两次以检查值?
编辑:我想仅在值与已使用相同prekusvach_id
的最后一个插入行相比发生更改时插入。因此,假设如果在一秒钟内cVkl的值从1变为0,我应该插入新行。但是如果cVkl的值仍然相同(1比1),我不应该插入新行
答案 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语句,它可能就是你要找的东西。
答案 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
)