请问如何设置一个字段的默认值等于另一个字段

时间:2020-12-08 15:02:47
google搜不出来,都说用触发器,不死心,在CSDN问问

我遇到的问题是,如何设置一个字段的默认值等于另一个字段(该字段是自增的ID),然后又可以修改?

为什么会提出这个问题?
我有个文章的列表页,本来是按自增ID倒序排列的,用了一个分页存储过程来分页
然后编辑那边提出了一个需求,想要能够设定文章列表页的显示顺序
遗憾的是,我用的分页存储过程,用的是max方法,不支持多字段排序,也就是说 order by Sort asc, ID desc是不行的
于是,我想着增加一个排序字段Sort,其默认值等于自增ID
这样如果用户没有指定排序,按Sort字段desc排列,没有问题
如果用户指定了一行的顺序1, 假设原Sort值是100,那就把Sort设成 Sort = Sort + 100000 - 1 = 100099
查询的时候按Sort desc排列, 指定的那一行就显示在第一了,而后面的依然按照ID倒序排列
问题在于,如何把Sort字段的默认值设成ID...

说触发器的就算了....我也知道...

11 个解决方案

#1


if object_id('tb')is not null drop table tb
go
create table tb(id int identity,[name] varchar(10),Sort as id)
insert tb select 'a'
select * from tb
/*id          name       Sort        
----------- ---------- ----------- 
1           a          1
*/

#2


LS的兄弟,这种方法我也知道....问题是这样Sort就无法update了...

#3


用計算列,或用觸發器控制


create trigger Tr_t on t
after insert
as
update t
set Col2=Col
where exists(select 1 from inserted where ID=t.ID)

#4


引用 2 楼 pellet 的回复:
LS的兄弟,这种方法我也知道....问题是这样Sort就无法update了...


用觸發器控制

#5


计算列不可行,因为计算列无法update

触发器可行,但是比较繁琐,我有好几个表都想这样处理

到最后实在不行,我再用触发器...

#6


请问如何设置一个字段的默认值等于另一个字段

--

直接在存数据的时候,把这个字段的值按另一个字段来存就行了.不必那么麻烦.

#7


if object_id('tb')is not null drop table tb
go
create table tb(id int identity,[name] varchar(10),Sort int )
if object_id('tri_insert')is not null drop trigger tri_insert
go
create trigger tri_insert on tb 
for insert 
as 
 update tb set tb.sort=tb.id from inserted i where tb.id=i.id 
go
insert tb(name) select 'a'
insert tb(name) select 'b'
select * from tb
update tb set sort=5 where id=1
select * from tb
/*id          name       Sort        
----------- ---------- ----------- 
1           a          1
2           b          2

id          name       Sort        
----------- ---------- ----------- 
1           a          5
2           b          2
*/

#8


或用存儲過程控制,程序調用
如:
use tempdb
go
create table t(a int,b int)
go
create proc P @a int,@b int=@a
as
insert t(a,b)
values( @a,@b)
go
exec 5--a,b相同
go
exec p 5,6--不同時傳參

#9


好吧,谢谢各位,我还是用触发器吧...

#10


引用 6 楼 dawugui 的回复:
请问如何设置一个字段的默认值等于另一个字段

--

直接在存数据的时候,把这个字段的值按另一个字段来存就行了.不必那么麻烦.


我这个字段是自增的,没法知道值啊

#11


问题提得怪,答得看似有理,好象也有问题,不能修改

#1


if object_id('tb')is not null drop table tb
go
create table tb(id int identity,[name] varchar(10),Sort as id)
insert tb select 'a'
select * from tb
/*id          name       Sort        
----------- ---------- ----------- 
1           a          1
*/

#2


LS的兄弟,这种方法我也知道....问题是这样Sort就无法update了...

#3


用計算列,或用觸發器控制


create trigger Tr_t on t
after insert
as
update t
set Col2=Col
where exists(select 1 from inserted where ID=t.ID)

#4


引用 2 楼 pellet 的回复:
LS的兄弟,这种方法我也知道....问题是这样Sort就无法update了...


用觸發器控制

#5


计算列不可行,因为计算列无法update

触发器可行,但是比较繁琐,我有好几个表都想这样处理

到最后实在不行,我再用触发器...

#6


请问如何设置一个字段的默认值等于另一个字段

--

直接在存数据的时候,把这个字段的值按另一个字段来存就行了.不必那么麻烦.

#7


if object_id('tb')is not null drop table tb
go
create table tb(id int identity,[name] varchar(10),Sort int )
if object_id('tri_insert')is not null drop trigger tri_insert
go
create trigger tri_insert on tb 
for insert 
as 
 update tb set tb.sort=tb.id from inserted i where tb.id=i.id 
go
insert tb(name) select 'a'
insert tb(name) select 'b'
select * from tb
update tb set sort=5 where id=1
select * from tb
/*id          name       Sort        
----------- ---------- ----------- 
1           a          1
2           b          2

id          name       Sort        
----------- ---------- ----------- 
1           a          5
2           b          2
*/

#8


或用存儲過程控制,程序調用
如:
use tempdb
go
create table t(a int,b int)
go
create proc P @a int,@b int=@a
as
insert t(a,b)
values( @a,@b)
go
exec 5--a,b相同
go
exec p 5,6--不同時傳參

#9


好吧,谢谢各位,我还是用触发器吧...

#10


引用 6 楼 dawugui 的回复:
请问如何设置一个字段的默认值等于另一个字段

--

直接在存数据的时候,把这个字段的值按另一个字段来存就行了.不必那么麻烦.


我这个字段是自增的,没法知道值啊

#11


问题提得怪,答得看似有理,好象也有问题,不能修改