数据库如何保证数据唯一性?

数据库如何保证数据唯一性?,第1张

1、一般当你对一个表建主键的时候,数据库会自动在主键上建一个索引,该索引就是唯一的。2、索引是不会也没办法管理你数据是否唯一的,这个是有主键来保证。索引是为了提高数据的检索速度而设的,不要随便建很多索引,这样对数据库的性能影响很大。至于详细的知识,你还是找本书看看吧。

1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执行之后,就可以看到数据库中所有属于自己建的表的名称 2、查询SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_name FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id Where (dbo.sysobjects.xtype = 'u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties')) 3、在Sql查询分析器,还有一个简单的查询方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'" 执行完之后,就可以看到数据库中所有用户表的信息 4、查询总存储过程数:select count(*) 总存储过程数 from sysobjects where xtype='p' 附:xtype类型D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束L = 日志FN = 标量函数

IF = 内嵌表函数

P = 存储过程

PK = PRIMARY KEY 约束(类型是 K)

RF = 复制筛选存储过程S = 系统表TF = 表函数

TR = 触发器U = 用户表UQ = UNIQUE 约束(类型是 K)V = 视图X = 扩展存储过程 另:在sqlserver中取得某个数据库中所有表名的sql语句 select sysobjects.name from sysobjects.xtype ='U'SELECT name

WHERE (xtype = 'U') 在数据库的sysobjects表里有这个数据库全部表的信息, xtype值为'U'的就是表名 注意:一般通过上述方法获得全部用户表示都会有一个dtproperties表,SQLSERVER 默认它也是用户表,想要从用户表中排出,需要加上限定条件 status>0,即:select * from sysobjects where xtype='U' and status>0

需要考虑:

目前来看,因为会逻辑删除,所以shop_id + is_delete不能加唯一索引被删除的会重复。

加上delete_time字段。

建shop_id + file_url + is_delete + delete_time唯一索引。

删除行,同时赋值delete_time。这样删除行就不会冲突了。

新增行,is_delete和delete_time都是0。唯一索引也能保证只会有一条数据。

redis分布式锁有天然的问题。不做考虑(可以参考我的另一片文章 分布式锁 )。

所以,就使用mysql锁。

粒度可以为店铺粒度。唯一索引为shopId。

每次更新数据前,先锁shopId这个实体。再执行insert 或 update。

锁粒度也可以为店铺+文件粒度。唯一索引为shop_id+file_url。

每次更新数据前,先锁shop_id + file_url这个实体。再执行insert 或 update。

当被删除的数据,再次被添加时,不做插入 *** 作,直接更新原记录到正常状态。此时原表可以加唯一索引。

这个时候 *** 作历史就丢了,怎么办呢。新加一张表,专门用来记录变更流水。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6684581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存