Может ли таблица сервера sql иметь два столбца идентификаторов?

Мне нужно иметь один столбец в качестве первичного ключа, а другой — для автоматического увеличения поля номера заказа. Это возможно?

РЕДАКТИРОВАТЬ: я думаю, что я просто буду использовать составной номер в качестве номера заказа. В любом случае спасибо.


person William Hurst    schedule 08.12.2008    source источник
comment
Какую версию SQL Server вы используете?   -  person Joe Ratzer    schedule 08.12.2008


Ответы (9)


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) и СОЗДАТЬ ТАБЛИЦУ (SQL Server 2000):

Для каждой таблицы можно создать только один столбец идентификаторов.

person Eugene Yokota    schedule 08.12.2008
comment
Я пробовал это, но часто настройку можно изменить, поэтому я задал вопрос. - person William Hurst; 08.12.2008
comment
Это по спец. См. добавленную ссылку на msdn. - person Eugene Yokota; 08.12.2008

Вы можете использовать Sequence для второго столбца со значением по умолчанию, если вы используете 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

person benkevich    schedule 02.04.2014
comment
Хорошее предложение, единственная проблема - усечение таблицы. - person GoldBishop; 15.03.2016
comment
Я не уверен, что усечение является проблемой, если вы хотите сбросить последовательность, это легко сделать - person benkevich; 22.03.2016
comment
Да, но в отличие от идентификатора личности, вам нужно либо удалить последовательность, а затем снова добавить, либо пройти и переопределить начало последовательности. Для разработки и/или тестирования Sequence не является идеальной реализацией. Как только вы пройдете стадию разработки/тестирования, это станет чрезвычайно полезной реализацией. Просто PITA на стадии разработки - person GoldBishop; 23.03.2016

Добавьте один столбец идентификаторов, а затем добавьте вычисляемый столбец, формула которого является именем столбца идентификаторов.

Теперь оба будут увеличиваться одновременно

person Simon Powers    schedule 21.05.2011

Нет, невозможно иметь более одного столбца идентификаторов.

Enterprise Manager даже не позволяет вам установить > 1 столбец в качестве идентификатора. Когда второй столбец сделан удостоверением

Также обратите внимание, что @@identity возвращает последнее значение идентификатора для открытого соединения, что было бы бессмысленно, если бы для таблицы было возможно более одного столбца идентификаторов.

person Only333    schedule 29.05.2011

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.

person Ali Karaca    schedule 23.08.2012

Первичный ключ не обязательно должен быть столбцом идентификаторов.

У вас не может быть двух столбцов Identity.

Вы можете получить что-то близкое к тому, что хотите, с помощью триггера...

person Joe Ratzer    schedule 08.12.2008
comment
Это проблематично. Первичный ключ не допускает нулевых значений. Обычно автоматически сгенерированные ключи не включаются во вставки. Даже если вы используете триггер с INSTEAD OF INSERT для генерации вашего первичного ключа, он будет блевать (проверено на SQLSEVER2000) - person ; 13.01.2011
comment
@snmcdonald: не используйте SQL Server 2000 в 2011 году. - person abatishchev; 29.05.2011

на сервере sql невозможно иметь более одного столбца в качестве идентификатора.

person Mladen Prajdic    schedule 08.12.2008

Я только что создал код, который позволит вам вставить два идентификатора в одну и ту же таблицу. позвольте мне поделиться им с вами, если это поможет:

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

Спасибо,

person NiL    schedule 13.02.2014

Обходным путем может быть создание триггера 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
person Neha Verma    schedule 17.09.2014
comment
CREATE Последовательность ниже позволяет вам сделать значение по умолчанию, которое автоматически увеличивается. До 2012 года вы могли использовать функцию, которая увеличивает значение в таблице и возвращает его (аналогично тому, что вы сделали в своем ответе). И это может быть значением по умолчанию для столбца. Следует избегать триггеров. - person TamusJRoyce; 01.09.2017