Oracle插入记录时如何自动生成Name与Id组合的唯一键Registration Number
解决方案
不同数据库的实现方式略有差异,以下是主流数据库的可落地实现方案:
1. MySQL 5.7+/8.0+ 版本
推荐使用**计算列(Generated Column)**实现,无需额外写触发器,性能更稳定:
-- 新建表时直接定义字段 CREATE TABLE your_table ( Id INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(255) NOT NULL, Result CHAR(1) NOT NULL, `Registration Number` VARCHAR(255) GENERATED ALWAYS AS (CONCAT(Name, '-', Id)) STORED UNIQUE ); -- 已存在的表可以直接修改新增字段 ALTER TABLE your_table ADD COLUMN `Registration Number` VARCHAR(255) GENERATED ALWAYS AS (CONCAT(Name, '-', Id)) STORED UNIQUE;
插入数据时不需要给Registration Number传值,直接写入Name和Result即可:
INSERT INTO your_table (Name, Result) VALUES ('John', 'P');
2. Oracle 版本
12c及以上版本(推荐虚拟列方案)
CREATE TABLE your_table ( Id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, Name VARCHAR2(255) NOT NULL, Result CHAR(1) NOT NULL, "Registration Number" VARCHAR2(255) GENERATED ALWAYS AS (Name || '-' || Id) VIRTUAL UNIQUE );
11g及更低版本(触发器兼容方案)
-- 第一步建表 CREATE TABLE your_table ( Id NUMBER PRIMARY KEY, Name VARCHAR2(255) NOT NULL, Result CHAR(1) NOT NULL, "Registration Number" VARCHAR2(255) UNIQUE ); -- 第二步建自增序列 CREATE SEQUENCE your_table_id_seq START WITH 1 INCREMENT BY 1; -- 第三步建触发器自动赋值 CREATE OR REPLACE TRIGGER trg_reg_num_generate BEFORE INSERT ON your_table FOR EACH ROW BEGIN IF :NEW.Id IS NULL THEN :NEW.Id := your_table_id_seq.NEXTVAL; END IF; :NEW."Registration Number" := :NEW.Name || '-' || :NEW.Id; END; /
3. PostgreSQL 版本
使用生成列实现:
CREATE TABLE your_table ( Id SERIAL PRIMARY KEY, Name VARCHAR(255) NOT NULL, Result CHAR(1) NOT NULL, "Registration Number" VARCHAR(255) GENERATED ALWAYS AS (Name || '-' || Id) STORED UNIQUE );
注意:所有方案下插入记录时都不需要手动维护
Registration Number字段,数据库会自动按规则生成,且天然满足唯一键约束要求,不会出现重复值。
内容的提问来源于stack exchange,提问作者Piku
相关产品推荐
相关产品推荐

