테이블 "TRANSACTION"에 대한 트리거를 쓰고 싶습니다. 새 라인이 삽입 될 때 "TRANSACTIONID"필드를 트리거하여 모든 이전 레코드의 최대 값 +1로 트리거하려고합니다.트리거를 작성해야합니다
SQL에 대해 많이 알지 못합니다. 누군가 나를 도울 수 있습니까? 이 테이블에 삽입에는 직렬화하므로
많은 감사
테이블 "TRANSACTION"에 대한 트리거를 쓰고 싶습니다. 새 라인이 삽입 될 때 "TRANSACTIONID"필드를 트리거하여 모든 이전 레코드의 최대 값 +1로 트리거하려고합니다.트리거를 작성해야합니다
SQL에 대해 많이 알지 못합니다. 누군가 나를 도울 수 있습니까? 이 테이블에 삽입에는 직렬화하므로
많은 감사
이것은, 다중 사용자 환경을위한 정말 좋은 생각입니다. , 당신은 "돌연변이 테이블을 피하기 위해 복잡한 3 트리거 솔루션을 쓸 필요가 실제로 최대 전류 값에 1을 더한있어 트리거 기반 솔루션을 작성하려면
create sequence transaction_seq;
create trigger transaction_bir before insert on transaction
for each row
begin
:new.id := transaction_seq.nextval;
end;
: 일반적인 접근 방식은 오라클 시퀀스를 사용하는 것입니다 "문제. 또는 당신은이 같은 현재의 최대 값을 유지하기 위해 다른 테이블을 사용하여 간단한 솔루션을 만들 수 있습니다
create table transaction_max (current_max_id number);
insert into transaction_max values (0);
create trigger transaction_bir before insert on transaction
for each row
declare
l_current_max_id number;
begin
update transaction_max set current_max_id = current_max_id + 1
returning current_max_id into l_current_max_id;
:new.id := l_current_max_id;
end;
이쪽 돌연변이 테이블 문제를 방지하고 삽입 (느리게) 직렬화됩니다, 그래서 어떤 이점을 볼 수 없습니다 이것의 순서를 사용하여.
. 이것은 나를 위해 작동 :) – Kevin
CREATE TRIGGER trigger1 on TransactionTable
INSTEAD OF INSERT
AS
BEGIN
DECLARE @MaxTranId INT
SELECT
@MaxTranId = MAX(TransactionId)
FROM
TransactionTable
INSERT INTO TransactionTable
SELECT
@MaxTranId + 1 ,
RestOfYourInsertedColumnsHere ,
FROM
inserted
END
GO
이 답변은 일부 DBMS에는 맞지만 Oracle에는 맞지 않을 수 있습니다. –
이것은 동시성에 안전하지 않습니다. 덕분에 –
이 작업의 IDENTITY 열을 고려 했습니까? 일반적으로이 작업을 위해 더 나은 접근 방법으로 간주됩니다. http://msdn.microsoft.com/en-us/library/ms186775.aspx를 참조하십시오. –
답장을 보내 주셔서 감사합니다. 나는 자동 증분 컬럼을 원하지 않는다. 이 방아쇠가 필요합니다. 도울 수 있니? – Kevin
어떤 SQL 버전을 사용하고 있습니까? 미시시피 SQL 서버, 오라클, MySQL은, 등? –