Gestion des clefs étrangères (problèmes de réplications)

Gestion des clefs étrangères (problèmes de réplications) - SQL/NoSQL - Programmation

Marsh Posté le 20-12-2006 à 17:27:18    

Bonjour,
 
J'ai une question sur la propagation des clefs étrangères.
 
J'ai une table t1 avec le schéma suivant :
 
cleprim (clef primaire)
nom
idnote(clef étrangère)
 
et une table t2 :
 
idnote(clef primaire)
clefprim
nom
 
dans T1 clefprim est auto incrémenté et idnote fait référence à idnote de t2
 
Voilà comment je fait pour lier mes deux tables : j'ajoute mes données à t1 puis je sauvegarde nom et clefprim que j'ajoute à t2 (idnote de t2 étant autoincrémentée)
Mais idnote de t2 n'est pas propagé dans t1... il faudrait que je récupère cette valeur et faire un update dans t1.
Ce n'est pas pratique, je n'ai jamais gérer de tables avec clefs étrangères, comment s'y prendre pour plus de facilité ?
 
 
En fait, je n'arrive pas du tout à gérer ma bases avec toutes ces clefs étrangères....  [:whyme]  

Reply

Marsh Posté le 20-12-2006 à 17:27:18   

Reply

Marsh Posté le 20-12-2006 à 20:00:28    

pas moyen de faire autrement.
 
a moins que ton SGBD ne supporte les vues capable d'accepter les insert (Oracle et SQL Server le permettent par exemple)

Reply

Marsh Posté le 20-12-2006 à 20:02:36    

ceci dit, ton modèle me semble chelou à souhait.

Reply

Marsh Posté le 20-12-2006 à 20:07:44    

-- edit : en fait il faut carrément passer par un trigger sur la vue, ça marche que pour le delete et l'update sinon :)

Reply

Marsh Posté le 20-12-2006 à 20:17:55    

oui un trigger serait bien adapté pour ca

Reply

Marsh Posté le 20-12-2006 à 20:24:16    

exemple complet (sql server 2005 express) :
 


CREATE TABLE t1 (
 idt1 numeric(18, 0) IDENTITY(1,1) NOT NULL,
 valt1 varchar(50) NOT NULL,
 CONSTRAINT PK_t1 PRIMARY KEY CLUSTERED  
(
 idt1 ASC
));
 
CREATE TABLE t2 (
 idt2 numeric(18, 0) IDENTITY(1,1) NOT NULL,
 refidt1 numeric(18, 0) NOT NULL,
 valt2 varchar(50) NOT NULL,
 CONSTRAINT PK_t2 PRIMARY KEY CLUSTERED  
(
 idt2 ASC
));
 
ALTER TABLE t2 WITH CHECK ADD CONSTRAINT FK_t2_t1 FOREIGN KEY(refidt1) REFERENCES t1 (idt1);
 
go
 
CREATE VIEW v1
WITH SCHEMABINDING, VIEW_METADATA
AS
SELECT     dbo.t1.idt1, dbo.t1.valt1, dbo.t2.valt2
FROM         dbo.t1 INNER JOIN
                      dbo.t2 ON dbo.t2.refidt1 = dbo.t1.idt1;
 
go
 
CREATE trigger [tg_v1_ins] on [v1]
instead of insert
as
    declare @newid as numeric;
begin
    select @newid = t1.idt1 from t1, inserted where t1.valt1 = inserted.valt1;
    if @newid is null
    begin
  insert into t1 (valt1) select valt1 from inserted
        set @newid = scope_identity()
    end
 insert into t2 (refidt1, valt2) select @newid, valt2 from inserted
end;
 
go
 
insert into v1 (valt1, valt2) values ('truc1', 'truc1.1');
insert into v1 (valt1, valt2) values ('truc1', 'truc1.2');
insert into v1 (valt1, valt2) values ('truc2', 'truc2.1');
insert into v1 (valt1, valt2) values ('truc2', 'truc2.2');
 
select * from t1;
 
select * from t2;
 
select * from v1;


 


 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
idt1                                    valt1
--------------------------------------- --------------------------------------------------
1                                       truc1
2                                       truc2
 
(2 row(s) affected)
 
idt2                                    refidt1                                 valt2
--------------------------------------- --------------------------------------- --------------------------------------------------
1                                       1                                       truc1.1
2                                       1                                       truc1.2
3                                       2                                       truc2.1
4                                       2                                       truc2.2
 
(4 row(s) affected)
 
idt1                                    valt1                                              valt2
--------------------------------------- -------------------------------------------------- --------------------------------------------------
1                                       truc1                                              truc1.1
1                                       truc1                                              truc1.2
2                                       truc2                                              truc2.1
2                                       truc2                                              truc2.2
 
(4 row(s) affected)
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed