Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एक लचीली विदेशी कुंजी

इसे हल करने का एक तरीका यह होगा कि आप अपने डेटाबेस में एक तालिका को अन्य तालिकाओं के लिए आधार की तरह कार्य करें और इसे अन्य तालिकाओं के साथ एक से एक संबंध के साथ जोड़ दें, और फिर ईवेंट तालिका को इस आधार तालिका से कनेक्ट करें।
यह आपको प्रत्येक तालिका के लिए डेटा अखंडता बनाए रखने की अनुमति देगा।
आधार तालिका केवल एक कॉलम जितनी सरल हो सकती है, या अन्य सभी तालिकाओं में समान स्तंभ हो सकते हैं, इस प्रकार एक प्रकार का "कार्यान्वयन" आपके डेटा संरचना में विरासत"।

आधार तालिका बनाएं (अन्य तालिकाओं के बीच कोई सामान्य स्तंभ नहीं मानते हुए):

CREATE TABLE TblObjectBase 
(
    ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
)

फिर, किसी अन्य तालिका के लिए जिसे ObjectId . द्वारा संदर्भित करने की आवश्यकता है Events . में टेबल:

CREATE TABLE TblClients 
(
    Client_Id int PRIMARY KEY,
    Client_FirstName varchar(10),
    Client_LastName varchar(10),
    --  Other client related data
    CONSTRAINT FK_TblClients_TblObjectBase
               FOREIGN KEY(Client_Id) 
               REFERENCES TblObjectBase(ObjectBase_Id)
)

CREATE TABLE TblInvoices
(
    Invoice_Id int PRIMARY KEY,
    -- other incoice related data
     CONSTRAINT FK_TblInvoices_TblObjectBase
               FOREIGN KEY(Invoice_Id) 
               REFERENCES TblObjectBase(ObjectBase_Id)
)

केवल एक ही चीज शेष है कि आप अपनी अन्य तालिकाओं पर किसी भी डालने के लिए TblObjectBase में एक नया मान डालें। इसे या तो संग्रहित प्रक्रियाओं द्वारा या ट्रिगर डालने के बजाय आसानी से प्राप्त किया जा सकता है।
एक सम्मिलित प्रक्रिया इस तरह दिख सकती है:

CREATE PROCEDURE Insert_TblClients
(
    @Client_FirstName varchar(10),
    @Client_LastName varchar(10),
    -- any other client related data you might have
)
AS
DECLARE @ClientId int

-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;

-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();

-- Insert the data to the clients table:
INSERT INTO TblClients 
(Client_Id, Client_FirstName, Client_LastName.....) VALUES
(@ClientId, @Client_FirstName, @Client_LastName...)

ट्रिगर डालने के बजाय ऐसा दिखाई देगा:

CREATE TRIGGER TblClients_IO_Insert ON TblClients INSTEAD OF INSERT 
AS
BEGIN

DECLARE @ClientId int

-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;

-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();

INSERT INTO TblClients 
(Client_Id, Client_FirstName, Client_LastName.....) 
SELECT @ClientId, Client_FirstName, Client_LastName..... 
FROM inserted

END

यदि आप डालने के बजाय के साथ जाना चुनते हैं, तो तथ्य यह है कि पहचान मूल्य किसी अन्य तालिका से आता है क्लाइंट के लिए पारदर्शी होना चाहिए (आपका vb.net प्रोग्राम)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर 2008 में डेटाबेस से अपने डेटा के साथ एक तालिका का बैकअप लें

  2. टेबल-लेवल बैकअप

  3. क्या मैं जॉइन कंडीशन में केस स्टेटमेंट का उपयोग कर सकता हूं?

  4. SYSUTCDATETIME () SQL सर्वर में उदाहरण (T-SQL)

  5. अभिव्यक्ति SSRS का उपयोग करके दो डेटासेट का उपयोग करके गणना में सहायता चाहिए