MYSQL Создание таблицы со значением (выражением) по умолчанию для столбца - PullRequest
3 голосов
/ 07 марта 2011

У меня есть таблица Employee(id,name,dept_name). Я хочу, чтобы идентификатор был буквенно-цифровым [dddddaaaaa], первые 5 цифр будут автоматически увеличиваться, а остальные 4 символа будут первыми 4 символами имени сотрудника.

Например, для первого имени сотрудника = Джона Тодда автоматически увеличенная часть идентификатора будет 00001. И поэтому идентификатор будет 00001JOHN.

Можно ли установить выражение по умолчанию дляId столбца = (concat(autoincrement,substring(name,4)).

Я также думал, смогу ли я создать триггер после вставки Employee, и триггер обновит Employee.Id.Но MySql не позволяет обновить ту же таблицу из триггера, для которого сработал триггер.

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 07 марта 2011

А как насчет схемы типа

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 не будет доступна на некоторых БД, где разрешения не находятся под вашим контролем.

0 голосов
/ 07 марта 2011

Вы можете попробовать объединить его в операторе select вместо сохранения столбца с автоинкрементом и столбца id,

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

Таким образом, вам не понадобятся триггеры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...