sql server 表可以有两个标识列吗?

问题描述 投票:0回答:10

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

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

sql sql-server identity-column
10个回答
43
投票
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:创建表 (Transact-SQL)创建表 (SQL Server 2000)

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


22
投票

如果您使用 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


9
投票

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

现在两者将同时递增


3
投票

不,不可能有多个身份列。

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

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


2
投票
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类型的唯一值。


1
投票

主键不需要是标识列。

您不能有两个身份列。

您可以通过触发器获得接近您想要的东西......


0
投票

在 sql server 中,不可能有超过一列作为标识。


0
投票

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

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

谢谢,


0
投票

在大多数关系数据库(如 SQL Server、Oracle 或 MySQL)中,一张表通常只能有一个标识列。标识列是在向表中添加新行时自动生成唯一值的列。

表中拥有多个标识列会导致哪一列作为主键产生歧义。 但是,您可以通过使用其他方法来实现类似的功能,例如:

  1. 复合键:
CREATE TABLE Orders (
    OrderID INT IDENTITY(1,1),
    ProductID INT,
    Quantity INT,
    -- Other columns related to orders

    CONSTRAINT PK_Orders PRIMARY KEY (OrderID, ProductID)
);

-1
投票

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

所以我有一个表,它有一个标识 col:applicationstatusid。它也是主键。 我想自动增加另一个列: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
© www.soinside.com 2019 - 2024. All rights reserved.