sql >> Databasteknik >  >> RDS >> Sqlserver

En flexibel främmande nyckel

Ett sätt att lösa det skulle vara att lägga till en tabell i din databas för att fungera som en bas för de andra tabellerna och koppla den till en en till en relation till de andra tabellerna och sedan koppla händelsetabellen till den här bastabellen.
Detta kommer att tillåta dig att behålla dataintegriteten för var och en av tabellerna.
Bastabellen kan vara så enkel som bara en kolumn, eller kan ha kolumner som alla andra tabeller har gemensamma, och därmed implementera ett slags " arv" i din datastruktur.

Skapa bastabellen (förutsatt att inga gemensamma kolumner mellan andra tabeller):

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

Sedan för alla andra tabeller som behöver refereras av ObjectId i Events tabell:

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)
)

Det enda som återstår är att infoga ett nytt värde i TblObjectBase för valfri infogning på dina andra tabeller. Detta kan enkelt uppnås med antingen lagrade procedurer eller istället för infogningsutlösare.
En infogningsprocedur kan se ut så här:

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...)

En utlösare istället för att infoga skulle se ut så här:

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

Om du väljer att gå med istället för infogning, bör det faktum att Identity-värdet kommer från en annan tabell vara transparent för klienten (ditt vb.net-program).



  1. Oracles behållare för J2EE (OC4J) i R12

  2. Oracle TNS:nättjänstens namn är felaktigt angivet

  3. Hur genererar man en dynamisk sekvenstabell i MySQL?

  4. dynamiskt rita polylinjer på googlemaps med php/mysql