0

我是一名 T-SQL 编码员,我开始在 MySQL Workbench 中编码。我正在尝试在 MySQL 中应用触发器和函数,但在语法上遇到了困难。

基本上,我下面的代码希望使用 StudentID(递增)作为我的 Studentnumber 代码的基础,该代码的最大值为 5 个零位。像这样----> 13-00001(其中 13 是年份的最后一位,1 是 StudentID 值。)所以如果我插入 291 条记录,我的最后一条记录将是 13-00291。

在 T-SQL 中,我有以下代码:

create table Student
(   StudentID int identity not null primary key,
    Name varchar(100),
    StudentNumber varchar(10) 
)

create function StudentNumber (@id int) 
returns char(9) 
as 
begin 
return (SELECT SUBSTRING((CONVERT(VARCHAR(10),GETDATE(),112)),3,2)) + '-' + right('000000' + convert(varchar(10), @id), 6) 
end

create trigger Student_insert on Student 
after insert as 
update 
    Student 
set 
    Student.StudentNumber = dbo.StudentNumber(Student.StudentID) 
from 
    Student 
inner join 
    inserted on Student.StudentID= inserted.StudentID

当我开始在 MySQL 中编码时,创建表是基本的,但是当我创建触发器和函数时,mysql 的工作方式似乎有很大的不同。我读过 MYSQL 中的 Identity 等价物是 AutoIncrement PK,但我也读过当触发触发器时,它无法获取我的 PK 的值,因为尚未提交记录(或类似的东西)我已经读过,在 MySQL 中执行我想要的功能的唯一方法是创建一个临时表来存储 ID 或其他内容。但是我想在这里询问其他人的意见,是否有一种方法可以在 MYSQL 中重新创建我的函数而不必求助于创建临时表。

谢谢

4

1 回答 1

0

如果你想在 MySql 中为此使用 auto_increment 字段,你必须有一个单独的表来进行这样的排序。

你的架构

CREATE TABLE student_seq(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY)|

CREATE TABLE student
(   StudentID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(100),
    StudentNumber VARCHAR(8) DEFAULT NULL
);

功能

CREATE FUNCTION student_number (id INT)
RETURNS VARCHAR(8) 
  RETURN CONCAT(DATE_FORMAT(CURDATE(), '%y'), '-', LPAD(id, 5, '0'));

现在触发

DELIMITER $$
CREATE TRIGGER tg_student_insert 
BEFORE INSERT ON Student
FOR EACH ROW 
BEGIN
  DECLARE nextid INT DEFAULT 0;
  INSERT INTO student_seq VALUES(NULL);
  SET nextid = LAST_INSERT_ID();
  SET NEW.studentid = nextid, NEW.studentnumber = student_number(nextid);
END$$
DELIMITER ;

让我们插入一个新学生

INSERT INTO student (studentid, name) VALUES(0, 'Jhon');

你会进入学生表

| STUDENTID | NAME | STUDENTNUMBER |
------------------------------------
|         1 | Jhon |      13-00001 |

这是SQLFiddle演示。

于 2013-06-03T03:26:47.673 回答