【问题标题】:Can a sql server table have two identity columns?一个sql server表可以有两个标识列吗?
【发布时间】:2010-09-25 19:59:37
【问题描述】:

我需要一列作为主键,另一列自动增加订单号字段。这可能吗?

编辑:我想我会使用一个复合数字作为订单号。无论如何,谢谢。

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: sql sql-server identity-column


【解决方案1】:

一种解决方法是创建一个递增计数器的 INSERT 触发器。

所以我有一个表,它有一个标识 col:applicationstatusid。它也是主键。 我想自动增加另一个 col: applicationnumber

这就是我写的触发器。

 create trigger [applicationstatus_insert] on [ApplicationStatus] after insert as 
       update [Applicationstatus] 
       set [Applicationstatus].applicationnumber =(applicationstatusid+ 4000000) 
       from [Applicationstatus] 
       inner join inserted on [applicationstatus].applicationstatusid = inserted.applicationstatusid

【讨论】:

  • CREATE Sequence 下面允许您创建一个自动递增的默认值。在 2012 年之前,您可以使用一个函数来增加表中的值并返回它(类似于您在答案中所做的)。这可能是列的默认值。应避免触发。
【解决方案2】:

如果您使用 SQL Server 2012,您可以将序列用于第二列的默认值

--Create the Test schema
CREATE SCHEMA Test ;
GO

-- Create a sequence
CREATE SEQUENCE Test.SORT_ID_seq
    START WITH 1
    INCREMENT BY 1 ;
GO

-- Create a table
CREATE TABLE Test.Foo
    (PK_ID int IDENTITY (1,1) PRIMARY KEY,
    SORT_ID int not null  DEFAULT (NEXT VALUE FOR Test.SORT_ID_seq));
GO

INSERT INTO Test.Foo VALUES ( DEFAULT )
INSERT INTO Test.Foo VALUES ( DEFAULT )
INSERT INTO Test.Foo VALUES ( DEFAULT )

SELECT * FROM Test.Foo 

-- Cleanup
--DROP TABLE Test.Foo
--DROP SEQUENCE Test.SORT_ID_seq
--DROP SCHEMA Test

http://technet.microsoft.com/en-us/library/ff878058.aspx

【讨论】:

  • 好建议,唯一的问题是表格截断。
  • 我不确定Truncation是否有问题,如果你想reset sequence,你可以轻松做到
  • 是的,但与身份标识符不同,您必须删除序列然后重新添加,或者通过并重新定义序列的开始。对于开发和/或测试,Sequence 不是理想的实现。一旦你通过了开发/测试阶段,它就是一个非常有用的实现。在开发阶段只是一个 PITA
【解决方案3】:

我刚刚创建了一个代码,允许您在同一张表上插入两个身份。让我分享给你,以防有帮助:

create trigger UpdateSecondTableIdentity
On TableName For INSERT
as
update TableName
set SecondIdentityColumn = 1000000+@@IDENTITY
where ForstId = @@IDENTITY;

谢谢,

【讨论】:

    【解决方案4】:
    create table #tblStudent
    (
        ID int primary key identity(1,1),
        Number UNIQUEIDENTIFIER DEFAULT NEWID(),
        Name nvarchar(50)
    )
    

    两个标识列是不可能的,但如果您接受使用唯一标识符列,那么此代码也可以执行相同的工作。您还需要一个额外的列 - 名称列 - 用于插入值。

    示例用法:

    insert into #tblStudent(Name) values('Ali')
    
    select * from #tblStudent
    

    Ps:NewID() 函数会创建一个 uniqueidentifier 类型的唯一值。

    【讨论】:

      【解决方案5】:

      添加一个标识列,然后添加一个计算列,其公式为标识列的名称

      现在两者将同时递增

      【讨论】:

        【解决方案6】:

        不,不可能有多个标识列。

        企业管理器甚至不允许您将 > 1 列设置为标识。当第二列成为身份时

        另请注意,@@identity 返回打开连接的最后一个标识值,如果一个表可能有多个标识列,这将毫无意义。

        【讨论】:

          【解决方案7】:
          CREATE TABLE [dbo].[Foo](
              [FooId] [int] IDENTITY(1,1) NOT NULL,
              [BarId] [int] IDENTITY(1,1) NOT NULL
          )
          

          返回

          Msg 2744, Level 16, State 2, Line 1
          Multiple identity columns specified for table 'Foo'. Only one identity column per table is allowed.
          

          所以,不,您不能有两个标识列。您当然可以使主键不自动递增(标识)。

          编辑:msdn:CREATE TABLE (Transact-SQL)CREATE TABLE (SQL Server 2000)

          每个表只能创建一个标识列。

          【讨论】:

          • 我试过这个,但通常可以更改设置,这就是我问这个问题的原因。
          • 这是规范的。请参阅添加的 msdn 链接。
          【解决方案8】:

          主键不必是标识列。

          您不能有两个身份列。

          你可以用触发器得到接近你想要的东西......

          【讨论】:

          • 这是有问题的。主键不允许空值。通常自动生成的键在插入时会被忽略。即使您使用带有 INSTEAD OF INSERT 的触发器来生成主键,它也会呕吐(在 SQLSEVER2000 上测试)
          • @snmcdonald:不要在 2011 年使用 SQL Server 2000。
          【解决方案9】:

          在 sql server 中,标识不能超过一列。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多