我有一个表女巫存储最低和最高气温,海水温度作为“tinyint”和其他参数。因为我预计新的空气输入在 -50 到 +50 度之间,所以我在 table 上做了一个触发器。但首先我做了这个程序:
begin
if temp<-50 or temp>50 then
set sts = 0;
else
set sts = 1;
end if;
END
触发器:
BEGIN
declare err boolean;
declare msg varchar(255);
call check_temp(NEW.Tmin,err);
IF err!=1 THEN
set msg = "Error: Tmin out of range.";
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
call check_temp(NEW.Tmax,err);
IF err!=1 THEN
set msg = "Error: Tmax out of range.";
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
END
如您所见,我为最大值和最小值调用了两次 check_temp。 由于我有更多的气象参数列,我需要将它们的“范围检查”添加到上述触发器中。
我的问题是:这是最明智的做法吗?像这样使用该程序两次(一旦我加上海水温度,它们将是三次),对我来说看起来很愚蠢。并在触发器中一一检查所有 8 个参数?我每次插入大约 50 行。使用触发器会慢很多吗?到目前为止,我为此使用了 PHP 端检查,但决定改用数据库功能。我可以那样使用触发器,还是它的用途完全不同?任何有关该主题的建议将不胜感激。 MySQL 是 5.5.27
最佳答案
其他产品的CHECK Constraints 功能在这种特殊情况下是合适的,但 MySQL 不支持此功能。通常触发器经常被用来实现你所需要的。
在下面的示例中,非常基本,所有列都在触发器上进行了验证,当您尝试插入 50 条记录时,需要几毫秒的时间。这只是概念验证,方便您在类似生产的环境中进行测试。
/*Table structure for table `table_variables` */
DROP TABLE IF EXISTS `table_variables`;
CREATE TABLE `table_variables` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`variable0` TINYINT(4) DEFAULT NULL,
`variable1` TINYINT(4) DEFAULT NULL,
`variable2` TINYINT(4) DEFAULT NULL,
`variable3` TINYINT(4) DEFAULT NULL,
`variable4` TINYINT(4) DEFAULT NULL,
`variable5` TINYINT(4) DEFAULT NULL,
`variable6` TINYINT(4) DEFAULT NULL,
`variable7` TINYINT(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
/* Trigger structure for table `table_variables` */
DELIMITER $$
/*!50003 DROP TRIGGER*//*!50032 IF EXISTS */ /*!50003 `trg_check_bi` */$$
CREATE TRIGGER `trg_check_bi` BEFORE INSERT ON `table_variables`
FOR EACH ROW
BEGIN
DECLARE msg VARCHAR(255);
DECLARE _min, _max TINYINT DEFAULT -49;
SET _max := _max * (-1);
SET @max = _max;
IF (new.`variable0` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable0 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
IF (new.`variable1` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable1 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
IF (new.`variable2` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable2 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
IF (new.`variable3` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable3 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
IF (new.`variable4` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable4 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
IF (new.`variable5` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable5 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
IF (new.`variable6` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable6 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
IF (new.`variable7` NOT BETWEEN _min AND _max) THEN
SET msg := 'Error: variable7 out of range.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
END $$
DELIMITER ;
INSERT `table_variables` (
`variable0`,
`variable1`,
`variable2`,
`variable3`,
`variable4`,
`variable5`,
`variable6`,
`variable7`)
VALUES
(25, 46, 6, 42, 46, -42, -6, 47),
(11, -37, 26, -3, -44, 37, -28, -4),
(14, 33, -21, 40, 19, 23, 10, 29),
(-32, 1, -47, 10, 42, 36, 5, -34),
(-38, -40, -35, -6, 27, 7, 4, -49),
(-14, 29, 41, -29, -23, 22, 31, 41),
(-34, -49, 5, 27, -27, 30, -14, -11),
(36, -30, -14, -27, -44, 10, 33, -12),
(-10, 34, -42, 29, 29, 10, 11, -21),
(6, 45, -36, 29, 7, -3, 13, 25),
(37, -35, -40, -47, 32, -42, 38, -27),
(-4, 12, 24, 36, -39, 41, -22, 12),
(-19, 14, -18, 16, -15, 27, 31, 28),
(-3, -49, 11, -44, -8, 42, -8, -21),
(-31, -44, 21, -6, -42, -47, 38, -11),
(-21, -23, -1, 17, 36, -16, -40, -3),
(-43, 40, -16, 48, 43, 22, 29, 32),
(25, -21, -32, -47, 6, 28, -28, 23),
(-45, -48, 42, 11, -22, 4, 36, 24),
(-39, -21, -34, 39, -47, -10, 46, 16),
(-10, -48, 37, -15, -37, 8, 5, -47),
(-4, -25, 32, -8, 11, 31, -25, 26),
(-40, -30, 20, 44, 12, -22, -1, 16),
(32, -33, -14, -22, -19, 20, 13, -43),
(-10, 31, 39, -44, 8, 23, 44, 3),
(32, 3, -31, -15, -32, 34, 20, 47),
(30, -42, 44, 5, 41, 43, 44, 43),
(32, -16, -31, 43, -34, 45, -14, 37),
(-15, -38, 3, -17, -46, -31, 33, 12),
(13, -22, 0, 18, 42, 9, -31, -33),
(-23, 32, -16, -27, -38, 38, -40, 30),
(26, -9, 23, -4, -38, -31, 9, -11),
(-31, 25, -24, 48, -30, 48, -10, -47),
(41, 1, 31, 4, -21, 30, -33, -9),
(8, 16, 7, 39, 25, -38, -23, -47),
(-18, 1, 13, 13, -25, -14, -43, -25),
(-47, -11, 38, -23, 15, 0, 3, -31),
(-20, 44, 37, 4, -40, 33, 39, 47),
(-29, -40, 35, -46, 6, 21, 41, -4),
(4, -16, -42, -16, -1, -6, 23, -13),
(14, -40, 5, 0, 32, 16, 34, -24),
(24, 45, 7, -49, -22, -12, -43, -29),
(32, 1, -41, 38, -28, -11, -17, -5),
(-21, -39, 13, 37, -1, 32, 17, 40),
(-1, 25, -20, -26, -22, 18, 8, 37),
(13, 4, 32, 1, -41, 36, -38, 47),
(4, 26, -29, 25, -33, 5, -24, 15),
(-1, -1, 47, -4, -15, -11, 36, -29),
(-9, -7, 42, -14, -48, 47, 39, 3),
(-31, -20, 91, 17, -89, 4, -14, 22);
关于php - 用于在多次插入之前检查值的 MySQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19657353/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查