我正在尝试设置studentID字段,使其只能接受8位数字。我知道我无法通过检查限制来执行此操作,因为我的SQL不会接受它。另外,我如何设置一个字段,使其不能接受在EventID字段中小于1的数字?
行。所以,从我给出的链接,我试图触发。这会准确吗?我不确定语法或为什么在一个语句中有这么多的半冒号。我还假设我需要一个包含studentID的每个表的触发器? 谢谢
CREATE TABLE STUDENT (
StudentID Numeric(8) NOT NULL,
Password CHAR(15) NOT NULL,
CONSTRAINT STUDENTSTUDID_PRI_KEY PRIMARY KEY(StudentID));
CREATE TRIGGER STUD_ID_TRIG
BEFORE INSERT ON STUDENT
FOR EACH ROW BEGIN
DECLARE numLength INT;
SET numLength = (SELECT LENGTH(NEW.StudentID));
IF (numLength = 8 ) THEN
SET NEW.col = 1/0;
END IF;
END;
有人可以向我解释一下SET NEW.COL = 1/0;手段?
答案 0 :(得分:1)
借用评论中提到的罚款Answer,或至少悬挂下来的问题,(并保留其有趣的自定义错误讯息),
我在下面给出这个答案:
np.apply_along_axis
CREATE TABLE STUDENT
( StudentID int(8) not null primary key, -- 8 is display width, otherwise meaningless. It is an int
Password CHAR(15) NOT NULL
);
drop trigger if exists `STUDENT_SomeTrigger`;
DELIMITER $$
CREATE TRIGGER `STUDENT_SomeTrigger`
BEFORE INSERT ON `STUDENT`
FOR EACH ROW
BEGIN
DECLARE msg varchar(1000);
IF (New.StudentId < 10000000 or New.StudentId > 99999999) THEN
# it is not 8 digits, don't allow it
# note, leading zeros don't count!
# you made it an int (well you called it NUMERIC, same thing)
# if you mean for it to be a string, then do so
set msg = "DIE: You broke the rules... I will now Smite you, hold still...";
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
-- Do any other code here you may want to occur if it's all OK or leave blank it will be
-- skipped if the above if is true
END
$$
DELIMITER ;
insert STUDENT(StudentID,password) values (12345678,'OpenSesame');
-- 1 row(s) affected
insert STUDENT(StudentID,password) values (1234567,'No Insert');
-- Error Code: 1644. DIE: You broke the rules... I will now Smite you, hold still...
insert STUDENT(StudentID,password) values (123456789,'No Insert');
-- Error Code: 1644. DIE: You broke the rules... I will now Smite you, hold still...
insert STUDENT(StudentID,password) values (87654321,'Ok also');
-- 1 row(s) affected
这就是触发器如何满足您对ID大小的要求。也就是说,ID必须是8位数。
这就是我将其标记为重复的原因,但您希望在行动中看到它,这是可以理解的。
请参阅Trigger Syntax上的手册页。
请参阅Signal上的手册页。一页很长的页面。快速摘录:
SIGNAL是“返回”错误的方法。 SIGNAL提供错误 信息到处理程序,应用程序的外部,或 给客户。此外,它还提供对错误的控制 特征(错误号,SQLSTATE值,消息)。没有 SIGNAL,有必要采取故意的解决方法 引用一个不存在的表来使例程返回一个 错误。
答案 1 :(得分:0)
最好将Foreign Keys字段与它们引用的字段的数据类型相同。我知道数据类型有多么不同(例如signed int可以引用unsigned int),但是我不确定该行的位置。
话虽如此。如果STUDENT.StudentID
限制为8位,那么由于FK约束的性质,所有FK字段也是如此。