4

我必须创建一个表如下

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

有人能告诉我如何解决这个错误吗?

4

2 回答 2

3

它给出错误的原因是因为CHECK约束是指正在创建的表,但在解析语句时它并不存在。

但是我有一些坏消息要告诉你...... mysql 忽略了CHECK约束。它被允许作为语法仅用于与其他数据库中的 create 语句兼容。

请参阅CREATE TABLE 的 mysql 文档

CHECK 子句被解析,但被所有存储引擎忽略。

您必须使用触发器,但请注意,您不能从中引发异常。最好的希望是当您检测到问题时,执行诸如执行之类的操作SELECT * FROM TOO_MANY_LOANS,并希望调用者弄清楚错误“No such table TOO_MANY_LOANS”的真正含义。

于 2012-11-22T12:14:08.173 回答
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 将通知您的应用程序是否成功,以及为什么不成功。

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

于 2012-11-22T12:05:33.833 回答