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して、呼び出し元が「そのようなテーブルはありません」というエラーが実際に何を意味するのかを理解することを期待することです。

于 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は、アプリケーションが成功したかどうか、および成功しなかった理由をアプリケーションに通知します。

もう1つの利点は、アプリケーションコードを変更せずに、最大エントリを変更したり、顧客ごとに最大エントリを取得したりできることです。

于 2012-11-22T12:05:33.833 に答える