2009-12-05 5 views
1

J'ai une table de tableau suivantComment créer Composite Key et comment il se référer à autre table comme une clé étrangère

create table tblcountry (
    unqid uniqueidentifier 
    name varchar(100) 
    isremoved bit 
) 

Je veux créer la clé primaire sur la base de unqid + isremoved et dans lequel isremoved doit être vrai

j'ai une autre table:

create table tblstate (
    unqid uniqueidentifier, 
    name varchar(100) 
    f_tblcountry uniqueidentifier, 
    isremoved bit 
) 

la chose principale est que je veux que quand j'essaie de faire comme champ isremoved vrai ou 1 de tabcountry qu'il devrait me donner l'erreur si je ha Utilisez-le dans la table référencée tabstate et l'enregistrement auquel il a utilisé son champ supprimé est faux. et si le tabstate le isremoved est vrai pour cette clé primaire que son ne devrait pas donner d'erreur. J'ai exécuté votre solution en cours d'exécution.

Répondre

0
create table tblcountry (
    unqid uniqueidentifier, 
    name varchar(100), 
    isremoved bit, 
    PRImARY KEY (unqid, isremoved) 
) 


create table tblstate (
    unqid uniqueidentifier, 
    name varchar(100), 
    f_tblcountry uniqueidentifier, 
    isremoved bit, 
) 

    CREATE INDEX tblstateref ON tblstate (unqid, isremoved) -- always use index w/ foreign keys 

    ALTER TABLE tblstate ADD CONSTRAINT fk FOREIGN KEY (unqid, isremoved) references tblcountry (unqid, isremoved) 
+0

j'ai exécuté votre solution son fonctionnement bien.quand j'insère des données dans tabcountry son laissez-moi insérer mais quand j'essaie d'insérer dans tabstate son erreur me donner –

+0

toujours obtenir l'erreur: Msg 547, niveau 16, état 0, ligne 1 select * de tblcountry BCB1C75D-B70C-4C6E -8A88-01E4624CBDD2 \t ind F2C50808-9206-47D8-A712-701886244535 \t pak EA58024C-3B1A-4C59-8F56-AA7E8FD4436C \t afganistan insert en valeurs de tblstate (NEWID(), 'ràjasthàn' , 'BCB1C75D-B70C-4C6E-8A88-01E4624CBDD2', 0) L'instruction INSERT était en conflit avec la contrainte FOREIGN KEY "fk". Le conflit s'est produit dans la base de données "usecomp", table "dbo.tblcountry". La déclaration a été terminée. –

1

lors de l'insertion des données dans tabcountry son laissez-moi insérer mais lorsque je tente d'insérer dans tabstate son erreur me giveing ​​

select * from tblcountry 
5CF96D52-994B-45E3-9CF9-1BC948280E57 india 0 
AC2AB153-7FBA-48BC-911B-74A178C74FB5 pak 0 
763D2186-68BF-4334-AAA1-CCE16E14E6B1 us 0 

lors de l'insertion dans tabstate comme suit requête

insert INto tblstate values (NEWID(),'raj','5CF96D52-994B-45E3-9CF9-1BC948280E57',0) 

Je reçois l'erreur suivante:

Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the FOREIGN KEY constraint "fk". The conflict occurred in database "usecomp", table "dbo.tblcountry". The statement has been terminated.

+0

En effet, la contrainte est rétrograde. Elle doit être appliquée à la table tblcountry en référençant tblstate afin que vous puissiez ajouter des lignes à tblstate. –

1

I want to create primary key on basis of unqid + isremoved and in which isremoved must be true

en ce qui concerne les valeurs, une clé primaire assure seulement qu'ils sont uniqu e. Lorsqu'une clé primaire est un composite composé de plusieurs colonnes, cela signifie que la clé est une combinaison unique de toutes les colonnes impliquées. Cela signifie que si la clé primaire est à la fois unqid et isremoved - Seraient lignes valides dans votre table:

UNQID         | ISREMOVED 
--------------------------------------------------------------- 
6F9619FF-8B86-D011-B42D-00C04FC964FF | 1 
6F9619FF-8B86-D011-B42D-00C04FC964FF | 0 

Votre clé primaire ne devrait pas inclure la colonne isremoved.

...when I try to make the isremoved field value set to true/1 in the tblcountry table, I should get an error if I have used it in referenced table tblstate if its' isremoved field is not true. and if the tabstate the isremoved is true for that primary key than its should not give any error.

Pour ce faire, vous avez besoin d'une référence clé étrangère associant les colonnes unqid et isremoved dans le tblcountry aux colonnes unqid et isremoved dans le tableau tblstate.

ALTER TABLE tblcountry 
    ADD CONSTRAINT tstate_fk FOREIGN KEY (unqid, isremoved) references tblstate (unqid, isremoved) 

Joshua avait la bonne idée, la mauvaise direction.
Mais cela signifie que pour insérer un enregistrement dans tblcountry, vous doit ont la valeur unqid déjà tblstate. Une colonne avec une contrainte de clé étrangère peut être nullable - la valeur étant null ne déclenchera pas la contrainte de clé étrangère - mais vous ne pouvez pas spécifier une partie de la clé étrangère. Soit vous satisfaitez la clé étrangère, soit vous ne le faites pas. Je ne suis pas clair sur ce que vous espériez modéliser - si j'avais une meilleure idée, je fournirais des alternatives.

+0

erreur suivante: Msg 1776, niveau 16, état 0, ligne 1 Il n'existe aucune clé principale ou candidate dans la table référencée 'tblstate' qui correspond à la liste de colonnes de référence dans la clé externe 'tstate_fk'. Msg 1750, niveau 16, état 0, ligne 1 Impossible de créer une contrainte. Voir les erreurs précédentes. –

+0

lorsque j'exécute le code ur en obtenant cette erreur: Msg 1776, niveau 16, état 0, ligne 18 Aucune clé principale ou candidate dans la table référencée 'tblstate' ne correspond à la liste de colonnes de référence dans la clé externe 'tstate_fk '. Msg 1750, niveau 16, état 0, ligne 18 Impossible de créer une contrainte. Voir les erreurs précédentes. –

+0

Vous devez avoir des enregistrements de support dans 'tblstate' avant de pouvoir créer la contrainte. –

Questions connexes