mariadb 检查信用卡当前日期和到期日期的约束条件

4ioopgfo  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(152)

目前正在学习MariaDB,正在努力为付款表添加一个检查约束。我想检查输入的信用卡/借记卡的到期日期是否在当前日期之后。

Create table payments (
customerID          int(11)         Not Null,
debit_credit_Num    varchar(20)     Not Null,
expireDate          date            Not Null,
CVS                 int(3)          Not Null,
billaddress         varchar(100)    Not Null,
billcity            varchar(100)    Not Null,
billprovince        varchar(10)     Not Null,
billpostalcode      varchar(10)     Not Null,
billcountry         varchar(100)    Not Null,

Constraint fk_has_customerpayment Foreign Key (customerID) References customers(customerID),

Constraint chk_expdate check (date('now') < expireDate);
)

分析过程中发现2个错误。
1.应为符号名!保留关键字不能用作没有后引号的列名。(在位置463的“check”附近)。
1.无法识别的语句类型。(在位置470的“date”附近)
MariaDB说:

1064 -您的SQL语法有错误;查看与您的MariaDB服务器版本对应的手册,了解在第14行“”附近使用的正确语法

输入查询示例

Insert into payments (customerID, debit_credit_Num, expireDate, cvs, billAddress, billcity, billprovince, billpostalcode, billcountry) values

(1, '1234 5678 9123 4567', '2025-07-01', 213, '123 Church St', 'Burnaby', 'BC', 'V5A 1S6', 'Canada'),

(2, '0968 1723 2859 1902', '2025-04-01', 874, '321 W Popeyes Dr', 'Vancouver', 'BC', 'V6B 2J2', 'Canada')

(2, '0968 1723 2859 1111', '1999-04-01', 874, '321 W Popeyes Dr', 'Vancouver', 'BC', 'V6B 2J2', 'Canada'); <--- Should fail constraint

编辑1谢谢你Umut TEK,我试着这样做一个触发器,但我不知道我错在哪里

CREATE TRIGGER chk_expdate
BEFORE INSERT
ON payments 
FOR EACH ROW
BEGIN
IF (new.expiredate < CURRENT_DATE) THEN
    SIGNAL SQLSTATE '45000' 
           SET MESSAGE_TEXT = 'Card has expired'; [<------ Line 8]
END IF;
END;

错误消息:MySQL说:

1064 -您的SQL语法有错误;请查看与您的MariaDB服务器版本对应的手册,以了解在第8行“”附近使用的正确语法

它可以在https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=efb986c7edb6b4a3755639e2a380cae4上运行,但不能在PHPMyAdmin上运行。

Edit 2Paul T'slink的回答之后,在phpmyadmin上添加分隔符,设法使触发器工作

delimiter//
CREATE TRIGGER chk_expdate 
BEFORE INSERT ON payments 
FOR EACH ROW BEGIN 
IF (new.expiredate < CURRENT_DATE) THEN 
SIGNAL SQLSTATE '45000' 
SET MESSAGE_TEXT = 'Card has expired'; 
END IF; 
END;
68de4m5k

68de4m5k1#

这里有两个问题。第一个语法(缺少括号或分号放错位置)。它应该是这样的:

Create table payments (
customerID          int(11)         Not Null,
debit_credit_Num    varchar(20)     Not Null,
expireDate          date            Not Null,
CVS                 int(3)          Not Null,
billaddress         varchar(100)    Not Null,
billcity            varchar(100)    Not Null,
billprovince        varchar(10)     Not Null,
billpostalcode      varchar(10)     Not Null,
billcountry         varchar(100)    Not Null,

Constraint fk_has_customerpayment Foreign Key (customerID) References customers(customerID),

Constraint chk_expdate check (check condition));

第二个是date(now())或curdate()是不确定的函数,所以这种用法是不允许的。
允许使用文字、确定性内置函数和运算符。如果给定表中的相同数据,多次调用都产生相同的结果,且与连接的用户无关,则函数是确定性的。不确定且不符合此定义的函数示例:连接标识()、当前用户()、当前()。
Reference
然而,触发器允许你这样做。最好也检查here

相关问题