mysql - MySQL建表时的具体字段参数
问题描述
我正在使用 MySQL 工作台。
我想创建一个名为的表courseInfo
,我想在其中放置一个名为的列moduleCode
,但我希望它的格式始终相似:CFSM H0000
其中四个零是一个从 0000 开始增加的数字。
例如:
CFSM H0001
CFSM H0002
[..]
解决方案
您不能在 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 ;
推荐阅读
- google-chrome - chrome浏览器的地址栏自动完成是如何工作的
- python - 仅当未在 Python 类中定义时才覆盖使用自变量
- python-3.x - 明智地取出所有类型的电影
- python - 如何根据另一个对象的位置使某物旋转
- char - 乳胶表:在表格单元格中包含“\ n”?
- json - 如何为 Apache Flink 创建自定义 POJO
- android - 关于 Android 的 Firebase 身份验证 SHA1 的问题
- powershell - 任务计划 | 我正在尝试安排一个 .ps1 文件,但每次调度程序运行时都会出现一个弹出窗口“你想如何打开这个文件?”
- python - 如何将一个扩展名的一个目录的所有文件合并到一个文件夹中
- android - Gradle 构建过程失败