我遇到的问题是,如何设置一个字段的默认值等于另一个字段(该字段是自增的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)
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
用觸發器控制
#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
我这个字段是自增的,没法知道值啊
#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)
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
用觸發器控制
#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
我这个字段是自增的,没法知道值啊
#11
问题提得怪,答得看似有理,好象也有问题,不能修改