Recentemente tive a necessidade de adicionar uma coluna a minha tabela já com registos.
Essa coluna não era uma chave mas não podia usar auto incremento e não permite nulls..
Essa coluna é um id unico entre duas tabelas que não têm relação, uma de alunos e outra de adultos na qual preciso de um unico id, logo a chave primária não server ( como são tabelas diferentes podem ser repetidos)
Exemplo:
Tabela Aluno:
/col>/col>
| Id_aluno |
Nome |
| 1200 |
AAA |
| 1201 |
BBB |
| Id_adulto |
Nome |
| 5000 |
Adulto1 |
| 6000 |
Adulto2 |
(são duas tabelas mas ficaram mal formatadas no blogger …..)
Agora o pretendito é ter uma coluno com um id unico entre estas duas tabelas, como já havia dados na minha tabela tinha que fazer update. Primeiro na tabela alunos depois com o MAX desse passar para a sequencia para a tablea adulto para ficar assim
/col>/col>/col>
| Id_aluno |
Nome |
Unique_id |
| 1200 |
AAA |
1 |
| 1201 |
BBB |
2 |
| Id_adulto |
Nome |
Unique_id |
| 5000 |
Adulto1 |
3 |
| 6000 |
Adulto1 |
4 |
(são duas tabelas mas ficaram mal formatadas no blogger …..)
Após correr o script que segue, é necessário criar um trigger que no insert veja qual o maior unique id entre as duas tabelas, some 1 e insirar esse valor ainda não tenho o tirgger concluido pois no meu caso é mais complexo que este aqui se precisarem deixem um post e deixo aqui o select:
select
MAX(m.unique_id)
from
(
select
MAX(unique_id)
as unique_id
from aluno
union all
select
MAX(unique_id)as unique_id
from adulto
)
as m
Script alteração e update:
/*
################################################# #
# Script Criação campo unico entre aluno e #
# adulto #
# Autor: Marcos Alves #
# Date: 15-09-2009 #
# Version: 1.0 #
#################################################
*/
begin
transaction
– adicionar coluna unique_id na tabela aluno permitindo null
ALTER
TABLE Aluno
ADD unique_id int
GO
IF
@@ERROR
<> 0
IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION
GO
IF
@@TRANCOUNT
= 1
BEGIN
PRINT
‘dbo.Aluno Table Alter Successfully’
COMMIT
TRANSACTION
END
ELSE
BEGIN
PRINT
‘Failed To Alter dbo.Aluno Table’
END
GO
– adicionar coluna unique_id na tabela adulto permitindo null
begin
transaction
ALTER
TABLE adulto
ADD unique_id int
GO
IF
@@ERROR
<> 0
IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION
GO
IF
@@TRANCOUNT
= 1
BEGIN
PRINT
‘dbo.adulto Table Alter Successfully’
COMMIT
TRANSACTION
END
ELSE
BEGIN
PRINT
‘Failed To Alter dbo.adulto Table’
END
GO
– actualizar os registos da tabela aluno
begin
transaction
DECLARE @counter int
SET @counter = 0
UPDATE Aluno SET @counter = unique_id = @counter +1 –- aqui mágiaJ
GO
IF
@@ERROR
<> 0
IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION
GO
IF
@@TRANCOUNT
= 1
BEGIN
PRINT
‘dbo.Aluno Table Update Successfully’
COMMIT
TRANSACTION
END
ELSE
BEGIN
PRINT
‘Failed To Update dbo.Aluno Table’
END
GO
– actualizar os registos da tabela adulto a partir do max
begin
transaction
DECLARE @counter int
Select @counter=MAX(unique_id)
from student
UPDATE Adulto SET @counter = unique_id = @counter +1 –- de novo magiaJ
GO
IF
@@ERROR
<> 0
IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION
GO
IF
@@TRANCOUNT
= 1
BEGIN
PRINT
‘dbo.Adulto Table Update Successfully’
COMMIT
TRANSACTION
END
ELSE
BEGIN
PRINT
‘Failed To Update dbo.Adulto Table’
END
GO
–alterar table aluno campo unique_id not null
begin
transaction
ALTER
TABLE Aluno ALTER
COLUMN unique_id int
NOT
NULL
GO
IF
@@ERROR
<> 0
IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION
GO
IF
@@TRANCOUNT
= 1
BEGIN
PRINT
‘dbo.Aluno Table Alter not null Successfully’
COMMIT
TRANSACTION
END
ELSE
BEGIN
PRINT
‘Failed To Alter not null dbo.Aluno Table’
END
GO
–alterar table adulto campo unique_id not null
begin
transaction
ALTER
TABLE Adulto ALTER
COLUMN unique_id int
NOT
NULL
GO
IF
@@ERROR
<> 0
IF
@@TRANCOUNT
= 1 ROLLBACK
TRANSACTION
GO
IF
@@TRANCOUNT
= 1
BEGIN
PRINT
‘dbo.Adulto Table Alter not null Successfully’
COMMIT
TRANSACTION
END
ELSE
BEGIN
PRINT
‘Failed To Alter not null dbo.Adulto Table’
END
go
E é isto J espero que tenha ajudado e qualquer dúvida é só commentar J
Abraços
Recent Comments