MySQL中的固定数字字段

时间:2015-11-30 16:41:06

标签: mysql

我正在尝试设置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;手段?

2 个答案:

答案 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字段也是如此。