我是一名 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 中重新创建我的函数,而不必求助于创建临时表。
谢谢
最佳答案
如果你想在 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 演示。
关于mysql - 关于如何将我的 t-sql 代码转换为 mysql 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16889524/