数据库数字参考表的妙用

今天的主角就是数字参考表,什么是数字参考表?一个表中,存放了从1开始 连续到很大值的数字的表,我们称为数字参考表。

DROP TABLE IF 

EXISTS ref_number;
  CREATE TABLE `ref_number` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `status` TINYINT(3) DEFAULT 0 NOT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=INNODB DEFAULT CHARSET=utf8

#填充数据的存储过程

DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `sp_pCreateNums`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_pCreateNums`( cnt INT 

UNSIGNED) 

BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
TRUNCATE TABLE ref_number;
WHILE s <= cnt DO
BEGIN
INSERT INTO ref_number(id) SELECT s;
SET s= s+1;
END;
END WHILE;
END$$
DELIMITER ;

主题就是数据库中参考表的妙用,我们分三种需求来分别 说明数据库中参考表的使用,主要针对解决数据库的“历史问题”。

一、 两个事务同时锁定一个不存在id导致的死锁

两个事务同时向数据库插入记 录,插入的id是一样的。插入前查询表中是否存在这个id,如果不存在,那么会 给这个id上锁。mysql允许多个事务给同一条不存在的记录上锁,

然后在 插入记录,这个时候就产生冲突和死锁。

解决这个问题的方法还是挺多。

方案一:有可能的话,尽量使用auto_increment。

方案二:如果 不能使用auto_increment,程序尽量维护这个id的唯一性,不要重复使用。

方案三:引入参考表。

如果业务表不能建立auto_increment,也 不方便做一个算法来维护这个唯一性的列,那么我们建立一个数字参考表,如开 始建立的ref_number表。

id列对应业务的id列,status对应这个列是否被 使用,0为未使用,1为使用,修改业务表之前先从数字参考表中获取一个未使用 的id,

然后修改参考表的状态值,在使用这个值插入到表中,这样就不会 因为两个事务锁住同一个不存在的id而产生死锁。

二、两张同时有写入的 表之间数据同步,如何处理自增长主键的冲突问题。

这个问题在特殊的情 况下才会出现,主要是前期规划和后期需求的冲突导致的。

首先描述一下 需求和环境:

一个数据库实例里有两个数据库(schema),两个数据库内分 别有两个表。php.test和java.test。

test表大概如下:

CREATE 

TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` tinyint(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这个schema中表结构大 致一样,记录也是一样的,只是字段多少而已。现在的问题是多个团队和功能会 往这两个表插入数据,还有程序需要对这两个表做双向同步,保证他们数据一致 性。

现在我们模拟插入两条数据。

insert into php.test 

values ('','mysqlops');结果 1,mysqlops
  insert into java.test values ('','mysqlops');结果 1,

mysqlops

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索存储过程
, table
, 数字
, default
, procedure
参考
数据库参考文献、数据库设计参考文献、数据库论文参考文献、mysql数据库参考文献、oracle数据库参考文献,以便于您获取更多的相关知识。

时间: 2024-08-29 20:04:45

数据库数字参考表的妙用的相关文章

SQL Server创建数据库和数据表的相关约束实现方法_MsSql

本文分析了SQL Server创建数据库和数据表的相关约束实现方法.分享给大家供大家参考,具体如下: 创建约束语法如下: CREATE DATABASE [test] ON (NAME=N'test',FILENAME=N'd:\SQL2kt_Data\test.mdf',SIZE=3mb,MAXSIZE=UNLIMITED,FILEGROWTH=1MB) LOG ON (NAME=N'test_log',FILENAME=N'd:\SQL2kt_Data\test_log.ldf',SIZE=

SQL Server创建数据库和数据表的相关约束实现方法

本文分析了SQL Server创建数据库和数据表的相关约束实现方法.分享给大家供大家参考,具体如下: 创建约束语法如下: CREATE DATABASE [test] ON (NAME=N'test',FILENAME=N'd:\SQL2kt_Data\test.mdf',SIZE=3mb,MAXSIZE=UNLIMITED,FILEGROWTH=1MB) LOG ON (NAME=N'test_log',FILENAME=N'd:\SQL2kt_Data\test_log.ldf',SIZE=

V$session 表的妙用

session V$session 表的妙用^_^  选自WWW.CNONG.ORG  http://www.cnoug.org/viewthread.php?tid=38191 v$session 表中比较常用的几个字段说明^_^ 1. sid,serial#通过sid我们可以查询与这个session相关的各种统计信息,处理信息.a. select * from v$sesstat where sid = :sid; 查询用户相关的各种统计信息. select a.sid,a.statisti

如何将数据写入到数据库中的表中(c#连接sql数据库)

问题描述 我们使用c#连接数据库时,例如插入一条记录时,数据会被写调入数据缓冲区中,但并没有从数据缓冲区中写入到数据库的表中.当打开数据库中的表时,插入的数据并没显示在数据库的表中.如何才能真正把数据插入表中.希望大家多多指点. 解决方案 解决方案二:参考下SqlConnectionconn=newSqlConnection("DataSource=.;InitialCatalog=trace;IntegratedSecurity=True");conn.Open();SqlDataA

jsp-java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法

问题描述 java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法 java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法 解决方案 参考:http://blog.csdn.net/casilin/article/details/5750773 解决方案二: 楼主幸苦了!!谢谢分享!!! 解决方案三: jsp导excel到mysql数据库 http://wenku.it168.com/d_000468232.shtml

oracle数据库如何删除表

问题描述 oracle数据库如何删除表 sql语句删的时候都会出现 SQL> drop table crm; drop table crm ORA-00604: 递归 SQL 级别 2 出现错误 ORA-00942: 表或视图不存在 SQL> 的错误,请问怎么删 解决方案 你这个表名正确吗crm show tables; 查看一下司否有这个表 解决方案二: 当前用户登录后,看下时候有这张表吗?确认有表的话,再确认当前用户时候有删表的权限.如果没权限,应该不是报这样的错吧.估计是连访问的这个表的

MySQL数据库查看数据表占用空间大小和记录数的方法_Mysql

如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHEMA : 数据库名 TABLE_NAME:表名 ENGINE:所使用的存储引擎 TABLES_ROWS:记录数 DATA_LENGTH:数据大小 INDEX_LENGTH:索引大小 其他字段请参考MySQL的手册,这几个字段对我们来说最有用. 一个表占用空间的大小,相当于是 数据大小 +

hibernate连接多数据库,同样表结构的问题

问题描述 现有一个项目,采用sping+struts2+hibernate开发.有多个数据库,数据库中的表的结构完全相同.不同的用户登录后,连接到相应的数据库.现在有一问题,就是如何在hibernate中配置数据库链接?如果在hibernate中配置多数据库链接,该怎么配置? 解决方案 如果你用spring的话,可以用下面的饿配置: <code> <!-- 配置多数据源 --><bean id="dataSource" class="com.xe

SQL Server 实现数字辅助表实例代码_MsSql

数字辅助表是一个连续整数的数列,通常用来实现多种不同的查询任务.大多分两类:足够大物理数字表和表函数,前者可以称为静态的,后者可以称为动态且按需生产. 物理数字表     物理数字表通常存在一个物理表,表记录相对足够大,相关的T-SQL代码如下: IF OBJECT_ID(N'dbo.Nums', 'U') IS NOT NULL BEGIN DROP TABLE dbo.Nums; END GO CREATE TABLE dbo.Nums ( Num INT NOT NULL, CONSTRA