SQL是否可以自动递增数字,但前导为零?

2024-09-29 21:47:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我们的ID看起来像“CS0000001”,代表ID为1的客户。这是否可以使用SQL和自动增量,或者我需要在GUI中使用它

如果我用Python构造ID并将其插入数据库中,我需要前导零,但需要自动递增以防止重复使用

可能吗


Tags: id数据库sql客户gui代表增量前导
2条回答

你几乎没有选择:

  1. 在代码中构造CustomerID,将数据插入到 客户表(=应用程序端,需要更改代码)
  2. 在包含逻辑的Customer表顶部创建一个视图 当您需要CustomerID(=数据库端,需要更改代码)时,可以使用它
  3. 使用过程在中执行插入并构造CustomerID 过程(=数据库端,需要更改代码)

可能实现

  1. 创建数据表
    CREATE TABLE data (id CHAR(9) NOT NULL DEFAULT '',
                       val TEXT,
                       PRIMARY KEY (id));
    
  2. 创建服务表
    CREATE TABLE ids (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
    
  3. 创建生成id值的触发器
    CREATE TRIGGER tr_bi_data
    BEFORE INSERT
    ON data
    FOR EACH ROW
    BEGIN
        INSERT INTO ids () VALUES ();
        SET NEW.id = CONCAT('CS', LPAD(LAST_INSERT_ID(), 7, '0'));
        DELETE FROM ids;
    END
    
  4. 创建禁止id值更改的触发器
    CREATE TRIGGER tr_bu_data
    BEFORE UPDATE
    ON data
    FOR EACH ROW
    BEGIN
        SET NEW.id = OLD.id;
    END
    
  5. 插入一些数据,检查结果
    INSERT INTO data (val) VALUES ('data-1'), ('data-2');
    SELECT * FROM data;
    
    id        | val   
    :     | :  -
    CS0000001 | data-1
    CS0000002 | data-2
    
  6. 尝试更新,确保id更改被禁止
    UPDATE data SET id = 'CS0000100' WHERE val = 'data-1';
    SELECT * FROM data;
    
    id        | val   
    :     | :  -
    CS0000001 | data-1
    CS0000002 | data-2
    
  7. 再插入一个数据,确保枚举继续
    INSERT INTO data (val) VALUES ('data-3'), ('data-4');
    SELECT * FROM data;
    
    id        | val   
    :     | :  -
    CS0000001 | data-1
    CS0000002 | data-2
    CS0000003 | data-3
    CS0000004 | data-4
    
  8. 检查服务表是否已成功清除
    SELECT COUNT(*) FROM ids;
    
    | COUNT(*) |
    |    -: |
    |        0 |
    

db<&燃气轮机;小提琴here

缺点:

  1. 需要额外的表格
  2. 已禁用生成的id值编辑(必须改为使用复制和删除旧记录,无法设置自定义值)

相关问题 更多 >

    热门问题