0

嗨,我已经阅读了很多关于它的问题,但我还没有找到我的问题的答案。问题是这样的:我在 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;

我每秒左右插入数据。我只想在冒号 、 或 之一 改变了它的值时才插入数据。现在我正在考虑用 php 检查最后插入的行是否相同,但我的数据库将有大约 50000 行,因此随着数据库变大,速度会变慢。IzkOtZashtitaVklPrekcVklcIzkl

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

编辑:我只想在值与最后插入的具有相同prekusvach_id. 因此,假设在一秒钟内 cVkl 的值从 1 变为 0,我应该插入新行。但如果 cVkl 的值仍然相同(1 到 1),我不应该插入新行

4

6 回答 6

0

您可以使用触发器。更新有触发器。或者你只是使用一个简单的 php 查询来设置并检查值是否有变化。少于 100 万条记录的数据库往往非常快,但您也应该不时进行重新索引,以便您的查询更快。

于 2013-07-26T10:52:13.867 回答
0

复合唯一约束。

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

编辑:比前一个或所有以前的?

于 2013-07-26T10:53:57.140 回答
0

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

为什么不在此特定事件(更改您的值)发生后插入记录?

于 2013-07-26T11:11:40.053 回答
0

将检查抽象到数据库层。因此,编写一个程序来检查值是否已更改,如果更改则添加新行。一个电话给你,数据库正在做这项工作,而不是你。

于 2013-07-26T11:12:09.363 回答
0

看看 REPLACE 语句,它可能就是你要找的。

MySQL 手册 - 替换

于 2013-07-26T11:14:52.953 回答
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 
)
于 2015-06-09T21:57:03.327 回答