我必须创建一个表格如下
借款人(customerNo,LoanNo)
如果他们没有超过3笔贷款,客户可以贷款。我创建了表格如下
create table borrower(
customerno int(5),
LoanNo int(5),
primary key(customerno,loanno),
check( customerno not in
(select customerno from borrower group by customerno having count(loanno)>=4))
);
但它给我一个错误说
[root@localhost:3306] ERROR 1146: Table 'test.borrower' doesn't exist
有人可以告诉我如何修复此错误吗?
答案 0 :(得分:3)
它给出错误的原因是因为CHECK
约束引用了正在创建的表,但在解析语句时它不存在。
但我有一些坏消息...... mysql忽略CHECK
约束。它仅作为语法用于与其他数据库的create语句兼容。
请参阅mysql documentation for CREATE TABLE:
CHECK子句被解析但被所有存储引擎忽略。
您必须使用触发器,但请注意,您不能从一个触发器中抛出异常。您可以期待的最好的方法是在检测到问题时执行类似执行SELECT * FROM TOO_MANY_LOANS
的操作,并希望调用者能够确定错误“没有这样的表TOO_MANY_LOANS”真正意味着什么。
答案 1 :(得分:1)
由于这属于业务规则而不属于数据结构,因此您应该使用像这样的存储过程
DELIMITER ;;
CREATE PROCEDURE `AddCustomerLoan`(IN Acustomerno int(5), IN ALoanNo int(5), OUT ResultCode INT)
BEGIN
SELECT COUNT(*)
INTO @LoanCount
FROM borrower
WHERE customerno = Acustomerno;
IF @LoanCount < 4 THEN
INSERT INTO borrower ( customerno, LoanNo )
VALUES ( Acustomerno, ALoanNo );
SET ResultCode = 0;
ELSE
-- Too many Entries
SET ResultCode = 1;
END IF;
END;;
DELIMITER ;
ResultCode会通知您的应用程序是否成功,以及为什么不成功。
另一个优点是您可以修改最大条目或获得每个客户的最大条目,而无需更改您的应用程序代码。