gpt4 book ai didi

使用默认值(表达式)到列的 MYSQL 表创建

转载 作者:可可西里 更新时间:2023-11-01 08:21:58 24 4
gpt4 key购买 nike

我有一个表 Employee(id,name,dept_name)。我希望 id 为字母数字 [dddddaaaaa],前 5 位数字将自动递增 id 和其余4 个字符将是员工姓名的前 4 个字符。

例如,对于第一个员工姓名=John Todd,Id 的自动递增部分将为 00001。因此,Id 将为 00001JOHN

是否可以为列 Id=(concat(autoincrement,substring(name,4)) 设置默认表达式。

我也在考虑是否可以在插入 Employee 之后创建一个触发器,并且该触发器将更新 Employee.Id。但是 MySql 不允许从触发触发器的触发器更新同一个表。

请帮助。

最佳答案

像这样的模式怎么样

CREATE TABLE employee
(
employeeid INT PRIMARY KEY AUTO_INCREMENT,
firstname varchar(255)
);

CREATE INDEX part_of_firstname ON employee (firstname(4));

这将使您可以使用自然主键相当快速地执行查找,同时为您提供一个人工主键而不是强制非规范化。

EXPLAIN SELECT * FROM EMPLOYEE WHERE EMPLOYEEID = 1 AND FIRSTNAME LIKE 'john%';

+----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | employee | const | PRIMARY,part_of_firstname | PRIMARY | 4 | const | 1 | |
+----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+

当然,由于主键的 0001 部分是唯一的,因此您根本不需要查询姓名。

如果你坚持预先计算这应该可行

CREATE TABLE employee
(
employeeid INT PRIMARY KEY AUTO_INCREMENT,
specialid VARCHAR(255),
firstname VARCHAR(255)
);

CREATE INDEX employee_specialid ON employee (firstname(4));

DELIMITER ;;
CREATE TRIGGER employeeid_trigger BEFORE insert ON employee
FOR EACH ROW
BEGIN
SET new.specialid = CONCAT(LPAD((SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'employee'), 4, '0'), SUBSTRING(new.firstname, 1, 4));
END
;;
DELIMITER ;

测试它:

mysql> insert into employee (firstname) values ('johnathan');
Query OK, 1 row affected (0.04 sec)

mysql> insert into employee (firstname) values ('johnathan');
Query OK, 1 row affected (0.02 sec)

mysql> insert into employee (firstname) values ('johnathan');
Query OK, 1 row affected (0.02 sec)

mysql> select * from employee;
+------------+-----------+-----------+
| employeeid | specialid | firstname |
+------------+-----------+-----------+
| 1 | 0001john | johnathan |
| 2 | 0002john | johnathan |
| 3 | 0003john | johnathan |
+------------+-----------+-----------+
3 rows in set (0.00 sec)

这是一种 hack,information_schema 在某些权限不受您控制的数据库上不可用。

关于使用默认值(表达式)到列的 MYSQL 表创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com