我需要有一列作为主键,另一列需要自动递增订单号字段。这可能吗?
编辑:我想我只会使用复合数作为订单号。不管怎样,谢谢。答案 0 :(得分:33)
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):
每个表只能创建一个标识列。
答案 1 :(得分:18)
如果您使用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
答案 2 :(得分:7)
添加一个标识列,然后添加一个计算列,其公式为标识列的名称
现在两者都会同时增加
答案 3 :(得分:3)
不可能有多个标识列。
企业管理器甚至不允许您设置> 1列作为标识。当第二列成为身份时
另请注意,@@ identity返回打开连接的最后一个标识值,如果表可能有多个标识列,则该标识值将毫无意义。
答案 4 :(得分: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类型的唯一值。
答案 5 :(得分:1)
主键不需要是标识列。
您不能拥有两个标识列。
你可以用触发器获得你想要的东西......
答案 6 :(得分:0)
在sql server中,不可能有多个列作为标识。
答案 7 :(得分:0)
我刚刚创建了一个代码,允许您在同一个表上插入两个身份。如果有帮助,请与我分享:
create trigger UpdateSecondTableIdentity
On TableName For INSERT
as
update TableName
set SecondIdentityColumn = 1000000+@@IDENTITY
where ForstId = @@IDENTITY;
谢谢,
答案 8 :(得分:-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