首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建MYSQL表,并将默认值(表达式)设置为列

创建MYSQL表,并将默认值(表达式)设置为列
EN

Stack Overflow用户
提问于 2011-03-08 02:44:31
回答 2查看 7.8K关注 0票数 3

我有一个表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不允许更新触发器触发的同一个表。

请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-08 03:03:45

像这样的模式怎么样?

代码语言:javascript
复制
CREATE TABLE employee
(
employeeid INT PRIMARY KEY AUTO_INCREMENT,
firstname varchar(255)
);

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

这将允许您使用自然主键相当快速地执行查找,同时为您提供一个人工主键,并且不会强制反规范化。

代码语言:javascript
复制
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部分是惟一的,足以识别用户,所以根本不需要查询名称。

如果你坚持预先计算,这应该是可行的。

代码语言:javascript
复制
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 ;

测试:

代码语言:javascript
复制
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在某些数据库上将不可用。

票数 3
EN

Stack Overflow用户

发布于 2011-03-08 02:58:28

您可以尝试在select语句中连接它,而不是存储一个自动增量列和一个id列,

代码语言:javascript
复制
SELECT CONCAT(id, substring(name,4) FROM tbl_employee

这样你就不需要触发器了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5223732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档