MySql:Check语句中的Select语句

时间:2012-11-22 11:26:53

标签: mysql select

我必须创建一个表格如下

借款人(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

有人可以告诉我如何修复此错误吗?

2 个答案:

答案 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会通知您的应用程序是否成功,以及为什么不成功。

另一个优点是您可以修改最大条目或获得每个客户的最大条目,而无需更改您的应用程序代码。