我有一个表Employee(id,name,dept_name).I想要的id将与第一个5位数字字母数字dddddaaaaa将是自动递增的id,其余4个字符将是员工姓名的前4个字符。
例如,对于第一个员工name=John Todd,Id的自动递增部分将是00001。因此Id将为00001JOHN。
是否可以将默认表达式设置为列Id=(concat(autoincrement,substring(name,4))。
我还在想,是否可以在after insert Employee上创建触发器,该触发器将更新Employee.Id。但是MySql不允许更新触发器触发的同一个表。
请帮帮忙。
发布于 2011-03-08 03:03:45
像这样的模式怎么样?
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)这是一种黑客行为,如果权限不在您的控制之下,information_schema在某些数据库上将不可用。
发布于 2011-03-08 02:58:28
您可以尝试在select语句中连接它,而不是存储一个自动增量列和一个id列,
SELECT CONCAT(id, substring(name,4) FROM tbl_employee这样你就不需要触发器了
https://stackoverflow.com/questions/5223732
复制相似问题