ユーザーの誕生日が 18 歳以上であることを確認したい。以下のチェック制約を使用しました。
(FLOOR((MONTHS_BETWEEN(DOB,SYSDATE))/12))>=18
生年月日: 生年月日のテーブルのフィールド。
しかし、次のエラーが発生しました:
DOB は無効な識別子です。
ありがとう!
ユーザーの誕生日が 18 歳以上であることを確認したい。以下のチェック制約を使用しました。
(FLOOR((MONTHS_BETWEEN(DOB,SYSDATE))/12))>=18
生年月日: 生年月日のテーブルのフィールド。
しかし、次のエラーが発生しました:
DOB は無効な識別子です。
ありがとう!
Oracle では、CHECK 制約でシステム変数を参照することはできません。実際、制約が不確定になるため、SQL dbms がそれを許可しているとしたら、少し驚かれることでしょう。
データベース レベルでこれを回避する方法はいくつか考えられます。
Oracle のドキュメントには、チェック制約では決定論的関数のみが許可されることが明確に記載されています。sysdate
などsystimestamp
は明示的に禁止されています。 詳細をご覧ください。
この制限を回避する一般的な方法の 1 つは、データ モデルを利用することです。たとえば、 USERS テーブルには REGISTRATION_DATE がありますか? 確かにそのようなものがあるはずです。当然のことながら、REGISTRATION_DATE のデフォルトはsysdate
and です。あなたの制約は合法になります:
(FLOOR((MONTHS_BETWEEN(REGISTRATION_DATE, DOB))/12))>=18
ちなみに、 の引数の順序MONTHS_BETWEEN()
は (later_date、early date) になっていることに注意してください。 それをチェックしてください。