首页 > 解决方案 > MySQL建表时的具体字段参数

问题描述

我正在使用 MySQL 工作台。

我想创建一个名为的表courseInfo,我想在其中放置一个名为的列moduleCode,但我希望它的格式始终相似:CFSM H0000其中四个零是一个从 0000 开始增加的数字。

例如:

CFSM H0001
CFSM H0002
[..]

标签: mysqlsql

解决方案


您不能在 MySQL 中自动递增字符类型列,因为自动递增仅适用于整数类型列。moduleCode因此,不可能有一个(字母数字)自动递增列。但是,您可以尝试将其moduleCode分成两列,例如:

CREATE TABLE `courseInfo` (
 `prefix` CHAR(6) NOT NULL DEFAULT 'CFSM H',
 `id` SMALLINT(4) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
  KEY (`id`)
) AUTO_INCREMENT = 0;

例如,哪里prefix可能是“CFSM H”,id可能是 0001

然后,在执行 SELECT 语句时,您可以将该prefix列与该id列合并为一个moduleCode具有 CONCAT 的列,例如:

SELECT CONCAT(`prefix`, `id`) as `moduleCode` FROM `courseInfo`;

另一种方法(从 MySQL 5.7 及更高版本开始)似乎是使用生成的列,例如:

CREATE TABLE `courseInfo` (
 `prefix` CHAR(6) NOT NULL DEFAULT 'CFSM H',
 `id` SMALLINT(4) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
 `moduleCode` CHAR(10) AS (CONCAT(`prefix`, `id`)),
  KEY (`id`)
) AUTO_INCREMENT = 0;

但是,生成列的上述示例将不起作用,因为moduleCode它依赖于自动增量列,并且在计算生成列时尚未执行自动增量。另请参阅:https ://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html 。它将引发 ER_GENERATED_COLUMN_REF_AUTO_INC 错误。

因此,您可以使用第一个解决方案,或者尝试添加moduleCode为列并使用 AFTER INSERT 触发器来更新其值:

CREATE TABLE `courseInfo` (
 `prefix` CHAR(6) NOT NULL DEFAULT 'CFSM H',
 `id` SMALLINT(4) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
 `moduleCode` CHAR(10),
  KEY (`id`),
  UNIQUE KEY `unique_index` (`prefix`,`id`)
) AUTO_INCREMENT = 0;

DELIMITER //
CREATE TRIGGER `addModuleCode` AFTER INSERT ON `courseInfo`
FOR EACH ROW
BEGIN
  UPDATE `courseInfo` SET `moduleCode` = CONCAT(NEW.`prefix`, NEW.`id`) WHERE `prefix` = NEW.`prefix` AND `id` = NEW.`id`;
END;//
DELIMITER ;

推荐阅读