满口金牙 2021-10-13 11:19 采纳率: 91.5%
浏览 47
已结题

请教用什么方案, 一个mysql数据库 30多个表, 共用序列Id, Id且不重复, 这个表怎么设计:

请教用什么方案, 一个数据库 30多个表, 共用Id, Id且不重复, 这个表怎么设计:

我目前是想建一个只存ID的主表,
每次增加分表记录, 先在ID主表生成ID,再给分表用.

30多个分表的主键Id, 同时 一对一外键 ID主表

这样行不行,有什么更好的方案

  • 写回答

1条回答 默认 最新

  • 神仙别闹 2021-10-13 11:31
    关注

    采用主id表+触发器的方式进行设计,以下是设计思路。
    1.使用Sequence表维护id

    DROP TABLE IF EXISTS `sequence`;
    CREATE TABLE `sequence` (
    `tablename` varchar(64) NOT NULL,
    `nextid` bigint(20) DEFAULT NULL,
    PRIMARY KEY (`tablename`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    

    2.创建主键策略函数

    DROP FUNCTION IF EXISTS `auto_seq`;
    CREATE DEFINER = `root`@`localhost` FUNCTION `auto_seq`(tb_purpose VARCHAR(64))
    RETURNS int(11)
    BEGIN
    DECLARE reid int;
    set reid = (select `nextid` from `sequence` where `tablename`=tb_purpose limit 1);
    update `sequence` set `nextid`=reid + 1;
    return reid;
    end;
    

    3.在分表中创建触发器,此触发器为插入前触发,调用主键策略函数返回的结果赋予id

    DROP TRIGGER `auto_seq`;
    CREATE TRIGGER `auto_seq` BEFORE INSERT ON `item`
    FOR EACH ROW begin
    set new.id = auto_seq('item');
    end;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 已采纳回答 10月13日
  • 创建了问题 10月13日

悬赏问题

  • ¥15 制裁名单20240508芯片厂商
  • ¥20 易康econgnition精度验证
  • ¥15 线程问题判断多次进入
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接