Установить поле так же, как идентификатор (IDENTITY) во вставке - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть код (int) в моей таблице, идентификатор установлен на идентичность. Как я могу установить значение по умолчанию для моего кода, который будет заполнен тем же значением az ID? Я имею в виду личность.

Ответы [ 6 ]

2 голосов
/ 20 апреля 2011

Вы можете использовать after insert триггер:

create table TestTable (id int identity, col1 int)
go
create trigger TestTrigger on TestTable after insert
    as begin
    update  TestTable 
    set     col1 = id
    where   col1 is null
            and id in (select id from inserted)
    end
go

Тестовый код:

insert TestTable default values
insert TestTable (col1) values (666)
insert TestTable default values
select * from TestTable

В общем, я стараюсь держаться подальше от триггеров. В долгосрочной перспективе использование хранимой процедуры для вставки намного проще в обслуживании:

create procedure dbo.InsertTestRow(
    @col1 int)
as
insert  TestTable (col1) values (@col1)

if @col1 is null
    begin
    update  TestTable
    set     col1 = id
    where   id = SCOPE_IDENTITY()
    end
2 голосов
/ 20 апреля 2011

Если оно всегда имеет одно и то же значение - почему бы вам просто не уронить это поле. В противном случае его можно поддерживать с помощью триггеров (BEFORE INSERT один).

1 голос
/ 30 ноября 2016

Предполагая, что идентификатор вашей таблицы является столбцом Identity, вы можете использовать ограничение:

ALTER TABLE MyTable
ADD CONSTRAINT MyTableCodeDefault
DEFAULT IDENT_CURRENT('MyTable') FOR Code

Это работает для следующих случаев использования:

INSERT INTO MyTable DEFAULT VALUES
INSERT INTO MyTable ({columns NOT including 'Code'}) 
  VALUES ({value list matching insert columns})
INSERT INTO MyTable (Code) VALUES (666)
INSERT INTO MyTable (Code) SELECT 8 UNION SELECT 13 UNION SELECT 21

Но это не работает для массовых вставок:

INSERT INTO MyTable ({columns NOT including 'Code'})
SELECT {value list matching insert columns}
UNION 
SELECT {value list matching insert columns}
UNION
SELECT {value list matching insert columns}

Это ограничение может показаться обременительным, но по моему практическому опыту, это редко проблема. В большинстве случаев использования, с которыми мне приходилось сталкиваться, для которых необходимо значение по умолчанию, требуется удобство пользовательского интерфейса: не заставляйте пользователя выбирать значение, если он этого не хочет.

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

1 голос
/ 20 апреля 2011

Я ищу что-то в значении по умолчанию!Если оно равно null, оно должно быть заполнено тем же значением, что и id, но если ему присвоено какое-то значение, оно должно сохранить это значение

. Вы можете решить проблему, используя вместо этого coalesce в своих запросах.

create table T (ID int identity, ID2 int)

insert into T values (default)
insert into T values (null)
insert into T values (78)

select
  ID, 
  coalesce(ID2, ID) as ID2
from T

Результат

ID  ID2
--  ---
1   1
2   2
3   78
0 голосов
/ 20 апреля 2011

Вы можете использовать вычисляемый столбец, например так:

if object_id('TempTable') is not null drop table TempTable
create table TempTable (Id int identity(1,1), Code as Id)

insert into TempTable
default values

insert into TempTable
default values

insert into TempTable
default values

select * from TempTable

Конечно, если у вас есть другие столбцы, тогда вам не нужно default values:

if object_id('TempTable') is not null drop table TempTable
create table TempTable (Id int identity(1,1), Code as Id, SomethingElse int)

insert into TempTable (SomethingElse)
select 10 union all
select 11 union all
select 12

select * from TempTable

Но, как zerkms сказал - зачем вам два одинаковых столбца?

0 голосов
/ 20 апреля 2011

Если это поле Identity в SQL Server, ядро ​​базы данных позаботится о его значении. Обычно мы читаем запись обратно (после вставки), чтобы получить сгенерированный идентификатор.

РЕДАКТИРОВАТЬ: Похоже, вы пытаетесь "переопределить" личность? Если это так, перед вставкой выполните:

SET IDENTITY_INSERT [tableName] ON

Вы должны быть осторожны, чтобы не вставить значение, которое уже существует. Это может быть сложно, хотя. Поэтому, возможно, стоит рассмотреть возможность удаления свойства identity и самостоятельного управления значениями по умолчанию?

...