2016-12-18 2 views
2

я создал 2 таблицы, заголовок и строки:Сброс семян для каждого внешнего ключа поля

CREATE TABLE HEADER 
(
HeaderId int IDENTITY (1,1), 
HeaderName varchar(20) 
CONSTRAINT pk_header PRIMARY KEY (HeaderId) 
); 

CREATE TABLE Lines 
(
LineId int IDENTITY (1,1), 
HeaderId int REFERENCES HEADER(HeaderId), 
LineName varchar(20) 
CONSTRAINT pk_header_line PRIMARY KEY (LineId, HeaderId) 
) 

Это то, что моя таблица строк выглядит после вставки некоторых данных:

LineId HeaderId LineName 
1  1   Header1 Line1 
2  1   Header1 Line2 
3  2   Header2 Line1 

Есть ли какое-либо возможно ли, что LineId начинается с 1 при изменении HeaderId?

Что-то вроде этого:

LineId HeaderId LineName 
1  1   Header1 Line1 
2  1   Header1 Line2 
1  2   Header2 Line1 

ответ

1

Там нет встроенного механизма для этого.
Вы можете добавить столбец lines int в таблицу HEADER, которая содержит количество строк в заголовке, по умолчанию 0.
Когда вы вставляете запись в строки, вы должны использовать HEADER.lines + 1 для LineId и увеличивать HEADER.lines на 1.
Вы можете сделать это с помощью своего приложения с помощью триггера для вставок на Линии.
В любом случае учитывайте, что удаление на линиях прерывает последовательность.

create table header 
(
    headerid int   identity (1,1) constraint header_pk_headerid primary key 
    ,headername varchar (20) 
    ,lines  int   not null default (0) 
) 


create table lines 
(
    lineid  int   not null 
    ,headerid int   not null constraint lines_fk_headerid references header(headerid) 
    ,linename varchar (20) 
    ,constraint lines_pk_headerid_lineid primary key (lineid, headerid) 
) 

go 

create trigger lines_trg_ins 
on lines 
instead of insert 
as 

    declare @lines table (headerid int,lines int) 

    update h 
    set  h.lines = h.lines + i.lines 
    output deleted.headerid,deleted.lines into @lines 
    from   header as h 
      join (select headerid,count(*) as lines from inserted group by headerid) as i 
      on  i.headerid = h.headerid 

    insert into lines (lineid,headerid,linename) 
    select row_number() over (partition by i.headerid order by getdate()) + l.lines,l.headerid,i.linename 
    from inserted i join @lines l on l.headerid = i.headerid 

insert into header (headername) values ('header1'),('header2') 
insert into lines (headerid,linename) values (1,'header1 line1'),(1,'header1 line2'),(1,'header1 line3'),(2,'header2 line1'),(2,'header2 line2') 

select * from header 

+----------+------------+-------+ 
| headerid | headername | lines | 
+----------+------------+-------+ 
| 1  | header1 | 3  | 
+----------+------------+-------+ 
| 2  | header2 | 2  | 
+----------+------------+-------+ 

select * from lines order by headerid,lineid 

+--------+----------+---------------+ 
| lineid | headerid | linename  | 
+--------+----------+---------------+ 
| 1  | 1  | header1 line1 | 
+--------+----------+---------------+ 
| 2  | 1  | header1 line2 | 
+--------+----------+---------------+ 
| 3  | 1  | header1 line3 | 
+--------+----------+---------------+ 
| 1  | 2  | header2 line1 | 
+--------+----------+---------------+ 
| 2  | 2  | header2 line2 | 
+--------+----------+---------------+ 
+0

Большое спасибо, вы мне очень помогли! – Alina

Смежные вопросы