我听说在开发使用数据库的应用程序时,您应该进行数据库单元测试.数据库单元测试的最佳实践是什么?进行数据库单元测试以及如何"正确"执行此操作时,主要关注的是什么?
我们的数据库具有生成订单号的功能.它从"设置"表中读取值,递增它,然后返回新值.例如:
CREATE FUNCTION NextOrderNumber() RETURNS INTEGER UNSIGNED NOT DETERMINISTIC
BEGIN
DECLARE number INTEGER UNSIGNED;
UPDATE Settings SET IntegerValue=LAST_INSERT_ID(IntegerValue+1) WHERE KeyName='NextOrderNumber';
SET number=LAST_INSERT_ID();
return number;
END
Run Code Online (Sandbox Code Playgroud)
注意:不要批评这个功能我知道它有缺陷只是为了说明.
我们使用这个函数如下:
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
Run Code Online (Sandbox Code Playgroud)
启用二进制日志记录时,CREATE FUNCTION会出现此错误:
此函数在其声明中没有DETERMINISTIC,NO SQL或READS SQL DATA,并且启用了二进制日志记录(您可能希望使用安全性较低的log_bin_trust_function_creators变量)
无论binlog_format设置了什么,上述功能是否真的存在问题?根据我对相关MySQL页面的阅读,我看不出任何理由为什么这个函数与复制不兼容,无论是ROW还是STATEMENT级二进制日志记录.
如果函数是安全的,设置全局log_bin_trust_function_creators = 1会让我感到不安.我不想为所有功能禁用此检查,只需这一项.我可以改为将该函数标记为NO SQL以禁止警告吗?我尝试了它,它的工作原理.这会导致任何问题吗?
我最近在MySQL中做了很多sproc编程.
我必须说我喜欢它.很多.
然而调试这些婴儿很糟糕.
任何人都知道任何可以在My MySQL调试中获得快乐的工具吗?
我在尝试删除外键时遇到了一些麻烦.有人可以帮忙吗?
这是我的SHOW CREATE TABLE catgroup:
| catgroup | CREATE TABLE `catgroup` (
`catgroupid` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
PRIMARY KEY (`catgroupid`),
KEY `category_id` (`category_id`),
KEY `group_id` (`group_id`),
CONSTRAINT `catgroup_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `cat
s` (`cid`) ON UPDATE CASCADE,
CONSTRAINT `catgroup_ibfk_2` FOREIGN KEY (`group_id`) REFERENCES `groups
d`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 |
Run Code Online (Sandbox Code Playgroud)
这就是我试图删除外键的方式:
ALTER TABLE catgroup DROP FOREIGN KEY group_id_ibfk_2;
Run Code Online (Sandbox Code Playgroud)
这是错误信息:
错误1025(HY000):将".\ asset_base\catgroup"重命名为".\ asset_base"时出错
sql2-16b4-4'(错误号:152)
我究竟做错了什么?
我的SQL过程有问题.MySQLWorkbench告诉我它错过了我的第一个SET的"结束",但不是第二个.我不知道为什么.
DELIMITER $
drop procedure if exists pay10percent$
create procedure pay10percent(IN montant decimal(9,2),IN idResa INT(5))
begin
declare circuitid INT;
SET circuitid = (
SELECT IDCIRCUIT
FROM RESERVATION
WHERE IDRESERVATION=idResa
);
declare montantCircuit decimal(9,2);
SET montantCircuit = (SELECT PRIX FROM CIRCUIT WHERE IDCIRCUIT=circuitid);
end;
$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
谢谢.
我开始使用Erlang,但我已经陷入困境了.我从一本书中复制了这个例子:
-module(echo).
-export([start/0, loop/0]).
start() ->
spawn(echo, loop, []).
loop() ->
receive
{From, Message} ->
From ! Message,
loop()
end.
Run Code Online (Sandbox Code Playgroud)
但是当我尝试它时,我得到一个我不明白的错误:
31> c(echo).
{ok,echo}
32> f.
f
33> Pid = echo:start().
** exception error: no match of right hand side value <0.119.0>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?