2010-07-29 7 views
2

J'utilise SQL Server 2005 et que vous souhaitez créer des enregistrements d'adresse du numéro, la mise à jour des enregistrements de contact avec la nouvelle Id de:Comment puis-je insérer un ensemble d'enregistrements enfants lors de la mise à jour du parent?

Prenez les tableaux suivants

create table contact(id int primary key identity, home_address_id int, work_address_id int) 

create table address(id int primary key identity, street varchar(25), number int) 

et les clés étrangères:

ALTER TABLE dbo.contact ADD CONSTRAINT FK_contact_address1 FOREIGN KEY (home_address_id) REFERENCES dbo.address(id) 
ALTER TABLE dbo.contact ADD CONSTRAINT FK_contact_address2 FOREIGN KEY (work_address_id) REFERENCES dbo.address(id) 

des données fictives

insert into contact default values 
insert into contact default values 
insert into contact default values 

Comment puis-je insérer un enregistrement d'adresse vide par défaut pour tous les contacts qui n'ont pas d'adresse de domicile et mettre à jour le home_address_id en une fois?

La première partie est simple:

insert into address(street) select null from contact where home_address_id is null 

Je peux même obtenir le nouveau créer id adresse de:

declare @addressTable table(id int) 
insert into address(street) 
OUTPUT INSERTED.Id INTO @addressTable 
select null from contact where home_address_id is null 

est ici

select * from @addressTable 
de la nouvelle id

Mais comment mettre à jour le table de contact avec ces nouveaux ID?

Répondre

1

je le ferais à partir du moment où vous obtenez un nouveau contact, ainsi:

[receive contact information] 
//prior to inserting contact 
declare @homeAddress int, @workAddress int 

[insert home address here (real or default based on input)] 
set @homeAddress = @@Identity 

[insert work address here (real or default)] 
set @workAddress = @@Identity 

[insert contact here referencing @homeAddress & @workAddress] 

Pour les trucs déjà dans votre tableau, vous allez devoir associer tous vos identifiants de valeur null à une ID de contact Ou, vous pouvez effacer vos adresses de valeur nulle, et modifier la déclaration ci-dessus pour une mise à jour en quelque sorte (le cerveau ne fonctionne pas pour le moment, tout ce que je viens avec est un curseur, et les curseurs sont mauvais).

2

Si possible, je suggère normalisant votre base de données en ajoutant une table Contact_Addresses:

CREATE TABLE Contact_Addresses 
(
    contact_id INT NOT NULL, 
    address_id INT NOT NULL, 
    address_type VARCHAR(10) NOT NULL, 
    CONSTRAINT PK_Contact_Addresses PRIMARY KEY CLUSTERED (contact_id, address_id, address_type), 
    CONSTRAINT FK_ContactAddresses_Contacts (contact_id) REFERENCES Contacts (id), 
    CONSTRAINT FK_ContactAddresses_Addresses (address_id) REFERENCES Addresses (id), 
    CONSTRAINT CK_ContactAddresses_address_type CHECK address_type IN ('HOME', 'WORK') 
) 

Ensuite, je suggère de ne pas mettre les dossiers « factices » dans votre base de données. Cela va finir par causer des maux de tête sur la route. La base de données doit contenir un enregistrement précis des données dans votre système. Si vous souhaitez afficher une valeur par défaut lorsqu'aucune adresse n'existe dans le système pour un contact, gérez-la dans votre interface utilisateur.

Si vous devez vraiment bien, puis le code suivant devrait faire l'affaire:

;WITH C_CTE AS 
(
    SELECT 
     id, 
     home_address_id, 
     ROW_NUMBER() OVER(ORDER BY id) AS seq 
    FROM 
     Contacts 
), 
(
    SELECT 
     id, 
     ROW_NUMBER() OVER(ORDER BY id) AS seq 
    FROM 
     Addresses 
) 
UPDATE 
    C_CTE 
SET 
    home_address_id = A.id 
FROM 
    C_CTE C 
INNER JOIN A_CTE A ON A.seq = C.seq 
Questions connexes