How about a circuit like
CREATE TABLE employee ( employeeid INT PRIMARY KEY AUTO_INCREMENT, firstname varchar(255) ); CREATE INDEX part_of_firstname ON employee (firstname(4));
This will allow you to search fairly quickly using your natural primary key, providing you with an artificial primary key and not causing you 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 part 0001 of the primary key is unique enough to identify the user, you do not need to request a name at all.
If you insist on a preliminary calculation, 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:
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 a kind of hack, and information_schema will not be available on some databases where permissions are not under your control.
source share