我尝试按如下方式定义新表格,我希望IndexPosition
列默认获取MAX(IndexPosition) + 1
。
CREATE TABLE SpeechOutputList
(ID int NOT NULL IDENTITY(1,1),
IndexPosition int DEFAULT (???),
SpeechConfigCode nvarchar(36) NOT NULL,
OutputSentence nvarchar(500),
PRIMARY KEY(ID),
FOREIGN KEY(SpeechConfigCode) REFERENCES SpeechConfig ON UPDATE CASCADE ON DELETE CASCADE);
我想允许用户设置自己的自定义号码,但如果他没有提供任何此类号码,则默认为MAX(IndexPosition) + 1
。
我想过DEFAULT IDENTITY(1,1)
,但这是不可能的。
我也考虑过:DEFAULT SELECT MAX(IndexPosition) + 1 FROM SpeechOutputList
但它也是不可能的(错误:'在此上下文中不允许使用子查询。只允许使用标量表达式。')。
有人有想法吗?
答案 0 :(得分:2)
您可以使用SEQUENCE对象来完成。
SEQUENCE对象比IDENTITY属性更灵活。它们不绑定到一个表,如果需要,您可以在多个位置使用相同的SEQUENCE对象。他们也提供了更好的表现。
创建一个SEQUENCE对象,指定数据类型(int),起始值以及增量的数量。
CREATE SEQUENCE dbo.IndexPositionSequence
AS int
START WITH 1
INCREMENT BY 1;
然后创建表,并使用NEXT VALUE FOR函数从SEQUENCE对象中获取值。
CREATE TABLE dbo.SpeechOutputList
(
ID int NOT NULL IDENTITY(1,1),
IndexPosition int DEFAULT (NEXT VALUE FOR IndexPositionSequence),
SpeechConfigCode nvarchar(36) NOT NULL,
OutputSentence nvarchar(500),
PRIMARY KEY(ID)
)
然后我们可以在表格中插入一些值。某些值指定了IndexPosition,而其他值则没有。
INSERT INTO dbo.SpeechOutputList (IndexPosition, SpeechConfigCode, OutputSentence)
VALUES
(123, N'abcd', N'The quick brown fox'),
(DEFAULT, N'efgh', N'jumped over the'),
(124, N'ijkl', N'lazy dog'),
(DEFAULT, N'mnop', N'and some cats');
然后显示表格中的内容。
SELECT *
FROM dbo.SpeechOutputList;
请参阅MSDN> CREATE SEQUENCE(Transact-SQL):https://msdn.microsoft.com/en-us/library/ff878091.aspx
答案 1 :(得分:1)
这是我的建议
CREATE TABLE dbo.DataTable
(
ID int NOT NULL IDENTITY(1,1),
IndexPosition int,
Name varchar(10)
)
go
create trigger dbo.AI_DataTable on dbo.DataTable
after insert
as
begin
declare @id int = (select ID from inserted)
declare @ip int = (select IndexPosition from inserted)
print @id
print @ip
if (@ip is null)
begin
update dbo.DataTable
set IndexPosition = @id + 1
where ID = @id
end
end
-- you can implement any logic in trigger
-- Note: support bulk insert in trigger
insert into dbo.DataTable(Name) values ('First')
insert into dbo.DataTable (Name) values ('Second')
select * from dbo.DataTable
结果:
+----+---------------+--------+
| ID | IndexPosition | Name |
+----+---------------+--------+
| 1 | 2 | First |
| 2 | 3 | Second |
+----+---------------+--------+
答案 2 :(得分:0)
我不是在电脑上我做了这件事,但我想我已经弄明白了 我测试了这个 您可以将函数作为默认值 只需要一个返回值的函数 使该函数成为默认值
select isnull(max(IndexPosition),0) + 1 from table;