sql server 每加一条数据实现自动加一,但怎么实现删除一条数据后自动减一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 每加一条数据实现自动加一,但怎么实现删除一条数据后自动减一相关的知识,希望对你有一定的参考价值。

如果你用自增列的话是没办法自动减一的,除非你有管理员权限重置种子步长 参考技术A 思路如下

把要删除行的标号记录下来,然后删除该条数据
然后处理 将大于该标号的记录全部标号-1
参考技术B ID列如果不是自增字段,可以搞个触发器,参考下这个:
create trigger [dbo].[trig_delete] --创建触发器
on 表的名字 --作用于表
for delete --删除数据的时候触发
as
begin
declare @id int,@max_id int --定义变量,@id为删除数据的id号,@max_id为最大id号
select @id=ID列 from deleted --找出删除数据的id号
select @max_id=count(1) from 表的名字 --得出最大id号
while @id<@max_id begin
update 表的名字 --更新表,从删除数据那行的下一行开始id设为@id
set ID列=@id
where ID列=@id+1
set @id=@id+1 --@id加1,使之循环
end
end

在 SQL Server 中,表添加一列。导致视图错误

【中文标题】在 SQL Server 中,表添加一列。导致视图错误【英文标题】:In SQL Server, table add a column. causing view error 【发布时间】:2013-05-06 01:41:25 【问题描述】:

在 SQL Server 中,使用两个表创建一个视图。视图中使用了* 的表之一。

然后我在表格中添加一列。现在这会导致视图错误。

必须重建视图才能解决此问题。

如果这张表使用了很多视图,如何识别相关视图并重建?

有几种方法?

谢谢!

测试环境:SQL Server 2008

测试 SQL:

 if exists(select * from sys.objects where name='tblTestA' and type='u')
DROP TABLE  tblTestA

create table tblTestA(Part varchar(10),Qty int)
insert into tblTestA values('A',10)
insert into tblTestA values('B',20)
go

if exists(select * from sys.objects where name='tblTestB' and type='u')
    DROP TABLE  tblTestB
GO

create table tblTestB(Part varchar(10),Price decimal(9,4))
GO

insert into tblTestB values('A',1.1)
insert into tblTestB values('B',2.2)
GO

if exists(select * from sys.objects where name='v_test' and type='v')
    DROP VIEW  v_test
go

create View v_test
as
  select a.*,b.Price
  from tblTestA a, tblTestB b 
  where a.Part=b.Part
go

执行:

select * from v_test 
go

结果:

Part Qty Price
A   10  1.1000
B   20  2.2000

添加一列

alter table tblTestA add Remark nvarchar(200) not null default('test')
go

执行:

select * from v_test 
go

结果:

Part Qty Price
A   10  test
B   20  test

【问题讨论】:

您可以尝试在视图定义中搜索已更改的表,***.com/questions/4765323/is-there-a-way-to-retrieve-the-view-definition-from -a-sql-server-using-plain-ado Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已随 ANSI-92 SQL 标准(超过 20 年前!) 谢谢!好习惯:select a.*,b.Price from tblTestA a inner join tblTestB b on a.Part=b.Part ? 【参考方案1】:

如果您创建视图WITH SCHEMABINDING,则不会遇到此问题。对于您的 视图;-) 您可以使用sp_refreshview。

要查找哪些视图依赖于哪些表,您可以使用 GUI,但这不能很好地扩展。相反,我建议您使用系统管理视图,例如sys.sql_expression_dependencies。这使您可以遍历依赖视图并为每个视图发出exec sp_refreshview

【讨论】:

【参考方案2】:

您可以使用 SQL Server Management Studio 找出相关视图。

您需要在 SSMS 中选择表,然后右键单击它。选择View Dependencies

在这张图片中,表格是CompanyCategoryXref(蓝色箭头)。这种情况下的依赖视图是CompanyCategory(红色箭头)。您还可以看到选中的项目CompanyCategory 的对象类型为View(黄色圆圈)。

【讨论】:

根据您的提示,我找到了所有视图。然后什么 ?一一手动执行查看脚本? @dream - 正如其他答案中所建议的那样,您可以拥有一个更新视图的脚本。【参考方案3】:

我们遇到了同样的问题 - 我们的解决方案必须提供一个 SQL 脚本来刷新所有视图。我们在每批修改数据库结构的更新脚本之后运行此脚本 - 这可确保所有视图都是最新的且正常运行。

这是 T-SQL 代码:

DECLARE @viewname sysname
DECLARE @counter INT

SET @counter = 1

DECLARE viewname_cursor CURSOR FAST_FORWARD FOR
    SELECT v.[name] 
    FROM sys.views v
    INNER JOIN sys.sql_modules m ON v.object_id = m.object_id
    WHERE m.is_schema_bound = 0  -- only refresh non-schemabound views

OPEN viewname_cursor

FETCH NEXT FROM viewname_cursor INTO @viewname

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT CAST(@counter AS varchar(3)) + '. Refreshed view ' + @viewname

    EXEC sp_refreshview @viewname   -- refresh the view in question

    SET @counter = @counter + 1

    FETCH NEXT FROM viewname_cursor INTO @viewname
END

CLOSE viewname_cursor
DEALLOCATE viewname_cursor
GO

【讨论】:

以上是关于sql server 每加一条数据实现自动加一,但怎么实现删除一条数据后自动减一的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver字段如何自动更新

sqlserver 添加一条数据就在这条数据末尾储存当前时间 不知道怎么写这个触发器。 请大家帮帮忙!

SQLserver怎么实现将主键,自动加一的功能呢?

sql语句怎么添加一条记录?

如果数据丢失,平均每小时添加一条空记录

添加一条数据