MYSQL Table creation with default value(expression) to a column

匿名 (未验证) 提交于 2019-12-03 01:48:02

问题:

I have a Table Employee(id,name,dept_name).I want the id will alphanumeric [dddddaaaaa] with first 5 digit will be auto increment id and rest 4 char will be the first 4 char of employee name.

For example , for the first employee name=John Todd ,the auto incremented part of the Id will be 00001. And so the Id will be 00001JOHN.

Is it possible to set a default expression to the column Id=(concat(autoincrement,substring(name,4)).

I was also thinking if I Can create a trigger on after insert Employee and the trigger will update the Employee.Id. But MySql does not allow to update the same table from trigger for which trigger got fired.

Please Help.

回答1:

What about a schema like

CREATE TABLE employee ( employeeid INT PRIMARY KEY AUTO_INCREMENT, firstname varchar(255) );  CREATE INDEX part_of_firstname ON employee (firstname(4)); 

That'll let you perform lookups fairly quickly using your natural primary key, while giving you an artificial primary key and not forcing to denormalize.

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 |       | +----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+ 

Of course since the 0001 part of the primary key is unique enough to identify the user you need not query the name at all.

If you insist on precalculating this should work

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 ; 

Testing it:

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) 

This is kind of a hack, and information_schema won't be available on some DBs where permissions aren't under your control.



回答2:

You could try concatenating it in your select statement instead of storing an auto increment column and an id column,

SELECT CONCAT(id, substring(name,4) FROM tbl_employee 

That way you wouldn't need triggers



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!