SQL Identity(1,1)作为默认约束

时间:2016-05-05 17:14:15

标签: sql sql-server

我尝试按如下方式定义新表格,我希望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但它也是不可能的(错误:'在此上下文中不允许使用子查询。只允许使用标量表达式。')。

有人有想法吗?

3 个答案:

答案 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;

enter image description here

请参阅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;